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
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
- Convert the Internal Table to
- Assign the
XSTRING to the
RAWSTRING 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
RAWSTRINGfile content to a
- Convert the
XSTRINGto Internal Table
- Download the file to the presentation server using the Function Module
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.