How to Store Files in Database in ABAP
Nov 25, 2014
There are requirements where documents has to be uploaded and associated with business data available in the system. When we store files in tables, it will be easy to link it with other tables data. This article is aimed at storing files in databases and downloading or uploading them.
There is a data type named RAWSTRING
used for storing large binary data into database. RAWSTRING
is the Data Dictionary equivalent of the ABAP type XSTRING
. So you can assign an XSTRING
variable to RAWSTRING
variable and vice versa. We are going to create a Data Element with the data type RAWSTRING
.
Once the Data Element is created, create a Table with the following fields which is going to be used to store the files.
Now we are going to create two programs, one for uploading file to the database table from the presentation server and another to download it back to the presentation server.
##Uploading file to Database Table
The logic is simple as this,
- Upload the file into an Internal Table using the Function Module
GUI_UPLOAD
- Convert the Internal Table to
XSTRING
- Assign the
XSTRING
to theRAWSTRING
in the Work Area - Insert the Work Area into the database table
That’s it! The following code does the same.
report zupload.
parameters:
p_fname type string lower case.
data:
gs_store_file type zfar_store_file,
gt_content type standard table of tdline,
len type i,
xstr_content type xstring.
start-of-selection.
"Upload the file to Internal Table
call function 'GUI_UPLOAD'
exporting
filename = p_fname
filetype = 'BIN'
importing
filelength = len
tables
data_tab = gt_content
exceptions
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
others = 17.
if sy-subrc <> 0.
message 'Unable to upload file' type 'E'.
endif.
"Convert binary itab to xstring
call function 'SCMS_BINARY_TO_XSTRING'
exporting
input_length = len
* FIRST_LINE = 0
* LAST_LINE = 0
importing
buffer = xstr_content
tables
binary_tab = gt_content
exceptions
failed = 1
others = 2
.
if sy-subrc <> 0.
message 'Unable to convert binary to xstring' type 'E'.
endif.
clear gs_store_file.
gs_store_file-filename = p_fname.
gs_store_file-file_content = xstr_content.
"Insert file into table
insert zfar_store_file from gs_store_file.
if sy-subrc is initial.
message 'Successfully uploaded' type 'S'.
else.
message 'Failed to upload' type 'E'.
endif.
The code when execute asks for path of a file to be uploaded and uploads the file into the table.
##Downloading file from Database Table
This is going to be exact inverse of the uploading steps.
- Select the file from the table into a Work Area
- Assign the
RAWSTRING
file content to aXSTRING
variable - Convert the
XSTRING
to Internal Table - Download the file to the presentation server using the Function Module
GUI_DOWNLOAD
report zdownload.
parameters:
p_fname type zfar_store_file-filename lower case,
p_path type string lower case.
data:
gs_store_file type zfar_store_file,
xstr_content type xstring,
gt_content type standard table of tdline,
len type i,
str_fname type string.
start-of-selection.
select single * from zfar_store_file
into gs_store_file
where filename = p_fname.
xstr_content = gs_store_file-file_content.
"Convert xstring/rawstring to binary itab
call function 'SCMS_XSTRING_TO_BINARY'
exporting
buffer = xstr_content
importing
output_length = len
tables
binary_tab = gt_content.
.
if sy-subrc <> 0.
message 'Unable to convert xstring to binary'
type 'E'.
endif.
str_fname = p_fname.
call function 'GUI_DOWNLOAD'
exporting
bin_filesize = len
filename = p_path
filetype = 'BIN'
tables
data_tab = gt_content
exceptions
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
others = 22.
if sy-subrc <> 0.
message 'Unable to download file from SAP'
type 'E'.
endif.
And when executed,
Here to keep the things simple for the demo I’m storing the name of the file with full path as the key in the database table. But this is not a good idea. It is better you have a proper unique key. Make sure you also store the file type (preferably MIME type of the file) in a separate column, so that you do not depend upon the filename to determine the filetype.