这个问题困扰了我很久。
这个是POSTMAN下发参数的截图,jpeg跟 jpg是一个类型。
粗略版我写在了一个方法里:
METHOD SET_ATTACH.
DATA: HTTP_CLIENT_DATA TYPE REF TO IF_HTTP_CLIENT,
IV_URL TYPE STRING, "调用地址
LV_LEN TYPE I, "发送报文长度
LV_JSON_STR TYPE STRING, "需要发送的json报文
LV_RESPON TYPE STRING. "返回的报文
DATA:PART TYPE REF TO IF_HTTP_ENTITY.
"URL地址
**** formulario
DATA: IT_FORMULARIO TYPE TIHTTPNVP,
WA_FORMULARIO LIKE LINE OF IT_FORMULARIO. "传输FORM-DATA
TYPES:BEGIN OF TY_ACHEMENT,
SOURCE TYPE STRING,
ATTNAME TYPE STRING,
ATTTYPE TYPE STRING,
ATTOBJ TYPE XSTRING,
MEDIATYPE TYPE STRING,
END OF TY_ACHEMENT.
DATA :GT_ACHEMENT TYPE TABLE OF TY_ACHEMENT.
DATA :GS_ACHEMENT TYPE TY_ACHEMENT. "用于发送电子附件
DATA LV_SOURCE TYPE STRING .
DATA LV_ATTNAME TYPE STRING .
DATA LV_ATTTYPE TYPE STRING .
DATA LV_VALUE TYPE STRING.
**********************************************************************
*这个表里存放的是二进制数据流,我们平常可以通过图片上载函数,和 *SCMS_BINARY_TO_XSTRING函数转成二进制流,发送给对方。
DATA LT_ZPICTABLE TYPE TABLE OF ZPICTABLE.
DATA OUTPUT TYPE STRING.
SELECT * FROM ZPICTABLE INTO TABLE LT_ZPICTABLE.
READ TABLE LT_ZPICTABLE INTO DATA(LS_AA) INDEX 1.
**********************************************************************
GS_ACHEMENT-SOURCE = 'SAP'.
GS_ACHEMENT-ATTNAME = '1.jpeg'.
GS_ACHEMENT-ATTTYPE = 'jpeg'.
GS_ACHEMENT-ATTOBJ = LS_AA-FIELD1. "文件流
GS_ACHEMENT-MEDIATYPE = 'multipart/form-data'.
APPEND GS_ACHEMENT TO GT_ACHEMENT.
* IV_REQUEST_SET_ATTACH = /UI2/CL_JSON=>SERIALIZE( DATA = GT_ACHEMENT ).
DATA LV_ATTOBJ TYPE STRING.
LV_SOURCE = 'form-data; name="' && 'requestParamMap' && '[' && '''' && 'source' && '''' && ']' && '";'.
LV_ATTNAME = 'form-data; name="' && 'requestParamMap' && '[' && '''' && 'attName' && '''' && ']' && '";'.
LV_ATTTYPE = 'form-data; name="' && 'requestParamMap' && '[' && '''' && 'attType' && '''' && ']' && '";'.
LV_ATTOBJ = 'multipartFileMap' && '[' && '''' && 'attObj' && '''' && ']'.
**给FORM-DATA赋值
* WA_FORMULARIO-NAME = LV_SOURCE.
* WA_FORMULARIO-VALUE = GS_ACHEMENT-SOURCE. "来源系统
* APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
* WA_FORMULARIO-NAME = LV_ATTNAME.
* WA_FORMULARIO-VALUE = GS_ACHEMENT-ATTNAME. "附件名
* APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
* WA_FORMULARIO-NAME = LV_ATTTYPE.
* WA_FORMULARIO-VALUE = GS_ACHEMENT-ATTTYPE. "扩展名
* APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
** WA_FORMULARIO-NAME = LV_ATTOBJ.
** WA_FORMULARIO-VALUE = LS_AA-FIELD1. "文件流
** APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
* WA_FORMULARIO-NAME = 'mediaType'.
* WA_FORMULARIO-VALUE = 'multipart/form-data'.
* APPEND WA_FORMULARIO TO IT_FORMULARIO.
*
* WA_FORMULARIO-NAME = 'content-disposition'.
* WA_FORMULARIO-VALUE = `form_data;name="1";filename="1.jpg"`.
* APPEND WA_FORMULARIO TO IT_FORMULARIO.
* REPLACE 'SOURCE' WITH LV_SOURCE INTO IV_REQUEST_SET_ATTACH.
* REPLACE 'ATTNAME' WITH LV_ATTNAME INTO IV_REQUEST_SET_ATTACH.
* REPLACE 'ATTTYPE' WITH LV_ATTTYPE INTO IV_REQUEST_SET_ATTACH.
* REPLACE 'ATTOBJ' WITH LV_ATTOBJ INTO IV_REQUEST_SET_ATTACH.
* REPLACE 'MEDIATYPE' WITH 'mediaType' INTO IV_REQUEST_SET_ATTACH.
* IV_REQUEST_SET_ATTACH = TO_LOWER( IV_REQUEST_SET_ATTACH ) .
CASE SY-SYSID.
WHEN 'ED6'.
"* 测试机
IV_URL = 'xxx'.
"创建客户端请求
WHEN 'EP1'.
"* 生成机
IV_URL = 'as'.
WHEN OTHERS.
ENDCASE.
"创建实例
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
EXPORTING
URL = IV_URL
IMPORTING
CLIENT = HTTP_CLIENT_DATA.
"设定传输请求内容格式以及编码格式
CALL METHOD HTTP_CLIENT_DATA->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Content-Type'
VALUE = 'multipart/form-data'.
CALL METHOD HTTP_CLIENT_DATA->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = 'Authorization'
VALUE = IV_TOKEN.
"设定调用服务
HTTP_CLIENT_DATA->REQUEST->SET_METHOD( IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST ).
PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
**给FORM-DATA 填充参数
CLEAR LV_VALUE.
"form-data "来源系统
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = LV_SOURCE.
"form-data value值
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = 'SAP'.
part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
"附件名
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = LV_ATTNAME.
"form-data value值
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = '1.jpeg'.
part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
"扩展名
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = LV_ATTTYPE.
"form-data value值
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = 'jpeg'.
part = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
CALL METHOD PART->SET_HEADER_FIELD
EXPORTING
NAME = 'content-disposition'
VALUE = 'form-data; name="mediaType";'.
"form-data value值
CALL METHOD PART->APPEND_CDATA
EXPORTING
DATA = 'multipart/form-data'.
* PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
*
**给FORM-DATA 填充参数
* PART = HTTP_CLIENT_DATA->REQUEST->IF_HTTP_ENTITY~ADD_MULTIPART( ).
* CALL METHOD PART->SET_HEADER_FIELDS
* EXPORTING
* FIELDS = IT_FORMULARIO.
* 转二进制
* CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
* EXPORTING
* formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw.
* "文件
PART = HTTP_CLIENT_DATA->request->if_http_entity~add_multipart( ).
CALL METHOD PART->set_header_field
EXPORTING
name = 'content-disposition'
value = `form-data;name="multipartFileMap['attObj']";filename="1.jpeg";`.
"对应jpeg/jpg类型
CALL METHOD PART->SET_CONTENT_TYPE
EXPORTING
CONTENT_TYPE = 'application/x-jpg-compressed'.
* CONTENT_TYPE = 'image/jpeg'.
*FORM-DATA塞数据
LV_LEN = XSTRLEN( LS_AA-FIELD1 ).
CALL METHOD PART->SET_DATA
EXPORTING
DATA = LS_AA-FIELD1
OFFSET = 0
LENGTH = LV_LEN.
"设置待传输内容
CALL METHOD HTTP_CLIENT_DATA->SEND
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2.
IF SY-SUBRC <> 0.
"操作失败,获取失败原因
HTTP_CLIENT_DATA->GET_LAST_ERROR( IMPORTING MESSAGE = EV_MESG ).
EV_MESGTYP = 'E'.
EXIT.
ENDIF.
"读取远程服务返回的处理过结果。
CALL METHOD HTTP_CLIENT_DATA->RECEIVE
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3.
IF SY-SUBRC <> 0 .
HTTP_CLIENT_DATA->GET_LAST_ERROR( IMPORTING MESSAGE = EV_MESG ).
EV_MESGTYP = 'E'.
ELSE.
"读取返回返回内容
CLEAR LV_RESPON.
LV_RESPON = HTTP_CLIENT_DATA->RESPONSE->GET_CDATA( ).
LV_RESPON = '[' && LV_RESPON && ']'.
BREAK-POINT.
* /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_RESPON CHANGING DATA = LT_REV ).
EV_MESGTYP = 'S'.
ENDIF.
ENDMETHOD.