ABAP 调用HTTP上传附件
1、需求说明
在SAP中调用第三方文件服务器的HTTP请求,将文件保存在文件服务器上,并返回保存的文件地址。
SAP保存返回的文件地址,通过浏览器进行访问。
2、需求实现
2.1、POSTMAN测试
通过POSTMAN测试成功,获取返回的文件地址
并且可以看到请求对应编程语言的示例代码
2.2、代码示例
通过文件服务器URL创建http_client,设置类型为multipart/form-data,并传输请求参数
"-----------------------------@斌将军-----------------------------
TYPES: BEGIN OF ty_itab,
raw(255) TYPE x,
END OF ty_itab. DATA:lt_bin TYPE STANDARD TABLE OF ty_itab,
ls_bin LIKE LINE OF lt_bin. DATA: lv_len TYPE i, "发送报文长度
lv_url TYPE string, "接口地址
lo_http_client TYPE REF TO if_http_client, "http客户端
lo_part TYPE REF TO if_http_entity,
lv_value TYPE string,
lv_name TYPE string,
lv_file TYPE string,
lv_rec_json TYPE string, "接收的JSON
lv_code TYPE i, "HTTP 返回状态
lv_reason TYPE string. " HTTP 状态描述 DATA:lv_filelength TYPE i,
lv_xstring TYPE xstring. DATA:lv_account TYPE string,
lv_pass TYPE string.
。。。。。。
"创建http客户端
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
pse_not_found = 4
pse_not_distrib = 5
pse_errors = 6
oa2c_set_token_error = 7
oa2c_missing_authorization = 8
oa2c_invalid_config = 9
oa2c_invalid_parameters = 10
oa2c_invalid_scope = 11
oa2c_invalid_grant = 12
OTHERS = 13.
IF sy-subrc <> 0.
e_return-type = 'E'.
e_return-message = '无法创建http client'.
RAISE error.
ENDIF. "设置http method 为POST
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = '~request_method'
value = 'POST'. "SET protocol version
CALL METHOD lo_http_client->request->set_version(
if_http_request=>co_protocol_version_1_1 ). "content type
CALL METHOD lo_http_client->request->set_content_type
EXPORTING
content_type = 'multipart/form-data'. "用户名
CALL METHOD lo_http_client->request->set_form_field
EXPORTING
name = 'accessKey'
value = lv_account. "文件夹名称
CALL METHOD lo_http_client->request->set_form_field
EXPORTING
name = 'bucketName'
value = 'sap'. "密码
CALL METHOD lo_http_client->request->set_form_field
EXPORTING
name = 'secretKey'
value = lv_pass. "
"-----------------------------@斌将军-----------------------------
浏览器对应的编码和语言设置,可以参考浏览器中测试时,真实发送的请求参数
"-----------------------------@斌将军-----------------------------
"浏览器支持的 MIME 类型
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Accept'
value = '*/*'. "浏览器支持的压缩编码
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Accept-Encoding'
value = 'gzip, deflate'. "浏览器支持的语言
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Accept-Language'
value = 'zh-CN,zh;q=0.9,de;q=0.8,en;q=0.7'.
"-----------------------------@斌将军-----------------------------
添加上传的文件,其中文件名需要进行URL编码,可避免文件的中文乱码
其中name="file" 对应POSTMAN请求参数中的file
"-----------------------------@斌将军-----------------------------
CALL METHOD lo_http_client->request->if_http_entity~set_formfield_encoding
EXPORTING
formfield_encoding = cl_http_request=>if_http_entity~co_encoding_raw. lo_part = lo_http_client->request->if_http_entity~add_multipart( ). "拼接上传的文件名,并将文件名转码
lv_name = i_filename.
lv_name = cl_http_utility=>escape_url( lv_name ).
lv_value = 'form-data; name="file"; filename="' && lv_name && '";'. CALL METHOD lo_part->set_header_field
EXPORTING
name = 'content-disposition'
* value = 'form-data; name="file"; filename="11.txt";'.
value = lv_value. CALL METHOD lo_part->set_content_type
EXPORTING
content_type = 'application/x-www-form-urlencoded'.
"-----------------------------@斌将军-----------------------------
上传本地文件为二进制,并转为xstring格式
"-----------------------------@斌将军-----------------------------
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_file
filetype = 'BIN'
IMPORTING
filelength = lv_filelength
TABLES
data_tab = lt_bin
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.
e_return-type = 'E'.
e_return-message = '读取文件失败'.
RAISE error.
ENDIF. CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
IMPORTING
buffer = lv_xstring
TABLES
binary_tab = lt_bin
EXCEPTIONS
failed = 1
OTHERS = 2.
"-----------------------------@斌将军-----------------------------
将文件流放入client中并发送,接收返回结果
"-----------------------------@斌将军-----------------------------
lv_len = xstrlen( lv_xstring ). CALL METHOD lo_part->set_data
EXPORTING
data = lv_xstring
offset = 0
length = lv_len. "发送
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
IF sy-subrc <> 0.
CALL METHOD lo_http_client->get_last_error
IMPORTING
message = DATA(lv_error_message).
CALL METHOD lo_http_client->close. e_return-type = 'E'.
e_return-message = '通信失败'.
RAISE error.
ENDIF. "接收
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 9.
IF sy-subrc <> 0.
CALL METHOD lo_http_client->get_last_error
IMPORTING
message = lv_error_message.
CALL METHOD lo_http_client->close. e_return-type = 'E'.
e_return-message = '接收失败'.
RAISE error.
ENDIF. "提取返回字符串
CLEAR:lv_code,lv_reason.
CALL METHOD lo_http_client->response->get_status
IMPORTING
code = lv_code
reason = lv_reason. "获取返回的JSON
CLEAR:lv_rec_json.
lv_rec_json = lo_http_client->response->get_cdata( ). "关闭接口
CALL METHOD lo_http_client->close.
"-----------------------------@斌将军-----------------------------
3、补充说明
3.1、文件类型
在设置上传文件的类型时需要注意
文件有对应的类型参数,例如:
TXT:text/plain
Excel:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Word:application/vnd.openxmlformats-officedocument.wordprocessingml.document
PDF:application/pdf
PNG:image/png
应用程序:application/octet-stream
测试得出以下结论:(可能有出入,仅供参考)
1、如果上传文件时,设置了对应的参数,
1.1、且浏览器支持预览,则访问文件地址时,直接能在浏览器中显示文件的内容,比如:TXT、PDF、PNG等
1.2、如果浏览器不支持预览,则访问文件地址时,浏览器会自动下载对应的文件到本地,比如Excel、Word、应用程序等
2、如果上传文件时,没有设置对应的参数,比如直接设置application/x-www-form-urlencoded、application/octet-stream,就算是TXT文件,浏览器也不会支持预览,直接下载
3、如果上传文件时,没有设置正确的参数,比如Excel文件,设置了text/plain参数,则会导致文件识别失败,浏览器既不下载也不能正确预览
3.2、参数细节
关于参数中的q=0.8
q:相对品质因数。它指定用户喜欢哪种语言,范围从0到1,默认为1。
该质量值表示用户对由该范围指定的语言的偏好的估计
- 中文(简体)
- 中文(繁体)
- 丹麦语
- 乌克兰语
- 乌尔都语
- 亚美尼亚语
- 俄语
- 保加利亚语
- 克罗地亚语
- 冰岛语
- 加泰罗尼亚语
- 匈牙利语
- 卡纳达语
- 印地语
- 印尼语
- 古吉拉特语
- 哈萨克语
- 土耳其语
- 威尔士语
- 孟加拉语
- 尼泊尔语
- 布尔语(南非荷兰语)
- 希伯来语
- 希腊语
- 库尔德语
- 德语
- 意大利语
- 拉脱维亚语
- 挪威语
- 捷克语
- 斯洛伐克语
- 斯洛文尼亚语
- 旁遮普语
- 日语
- 普什图语
- 毛利语
- 法语
- 波兰语
- 波斯语
- 泰卢固语
- 泰米尔语
- 泰语
- 海地克里奥尔语
- 爱沙尼亚语
- 瑞典语
- 立陶宛语
- 缅甸语
- 罗马尼亚语
- 老挝语
- 芬兰语
- 英语
- 荷兰语
- 萨摩亚语
- 葡萄牙语
- 西班牙语
- 越南语
- 阿塞拜疆语
- 阿姆哈拉语
- 阿尔巴尼亚语
- 阿拉伯语
- 韩语
- 马尔加什语
- 马拉地语
- 马拉雅拉姆语
- 马来语
- 马耳他语
- 高棉语
一律不翻译英语
一律不翻译i.cnblogs.com
ABAP 调用HTTP上传附件的更多相关文章
- 黄聪:wordpress前台自定义用户,调用wp_editor上传附件提示【抱歉,出于安全的考虑,不支持此文件类型】错误。
1.直接禁用文件类型检测,在wp-config.php文件中,添加这样一句代码define('ALLOW_UNFILTERED_UPLOADS', true); 2.在functions.php里面, ...
- 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法
在服务器上架设好WordPress后,使用过程中发现,上传附件大小有2M的限制 话说服务器就是本机,可以直接把文件拖到附件存储文件夹下,然后在需要附件的地方引用链接 可是这种落后的方法终究不是办法,还 ...
- Dynamic CRM 2013学习笔记(十三)附件上传 / 上传附件
上传附件可能是CRM里比较常用的一个需求了,本文将介绍如何在CRM里实现附件的上传.显示及下载.包括以下几个步骤: 附件上传的web页面 附件显示及下载的附件实体 调用上传web页面的JS文件 实体上 ...
- webservice跨服务器上传附件
最近一个项目,用到文件上传功能,本来简单地使用upload控件直接post到服务器保存,简单实现了.后来考虑到分布是部署,静态附件.图片等内容要单独服务器(命名为B服务器,一台,192.168.103 ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- jeecms系统使用介绍——通过二次开发实现对word、pdf、txt等上传附件的全文检索
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76912307 本文出自[我是干勾鱼的博客] 之前在文章<基于Java的门户 ...
- Kindeditor编辑器上传附件,自动获取文件名显示。
大部分在线编辑器在上传附件之后都是会以路径的形式显示出来很不友好.类似这样..怎么样显示成这样用户上传的原始文件名呢.就是这样.是不是看着很友好. kindeditor编辑器上传文件是已插件的形式调用 ...
- ng2-file-upload上传附件同时传参
由于业务需要,需要的场景是发某条公告的时候能够上传附件,不只是图片,图片的话可以直接用base64传给后台,但上传附件这个就不能这样干了, 与此同时,每条公告都有一个对应的唯一标识id, 附件以文件流 ...
- httpclient 上传附件实例
httpclient 单附件上传实例 (扩展多附件上传实例,点我) /** * 上传附件 * @param host * @param uri * @param filePath 文件路径 * @p ...
随机推荐
- HDU 6467 简单数学题 (组合数学推导)
题意 题解 Step 1 把原式进行了最基本的变换,把 i 移到右边,并先枚举 j ,这里 i 从 0 开始枚举,并不影响答案,因为 C(j,0) 乘 0 后没有影响,但是这样方便后面的推导 Step ...
- 在 node 中使用 jquery ajax
对于前端同学来说,ajax 请求应该不会陌生.jquery 真的ajax请求做了封装,可以通过下面的方式发送一个请求并获取相应结果: $.ajax({ url: "https://echo. ...
- KingbaseES V8R3 集群专用机网关失败分析案例
KingbaseES R3集群网关检测工作机制: 1.Cluster下watchdog进程在固定间隔时间,通过ping 网关地址监控链路的连通性,如果连通网关地址失败,则修改cluster sta ...
- 项目管理构建工具——Maven(基础篇)
项目管理构建工具--Maven(基础篇) 在前面的内容中我们学习了JDBC并且接触到了jar包概念 在后面我们的实际开发中会接触到很多jar包,jar包的导入需要到互联网上进行就会导致操作繁琐 Mav ...
- Windows Server体验之SSH远程连接
经过之前的各种远程管理方法,Windows Server可以被很好的管理,也能符合大多数Windows管理员的使用习惯.不过既然是命令行版本的Windows能不能和Linux一样管理呢?Windows ...
- 工具推荐-使用RedisInsight工具对Redis集群CURD操作及数据可视化和性能监控
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x00 快速 ...
- 基于ELK Nginx日志分析
配置Nginx 日志 Nginx 默认的access 日志为log格式,需要logstash 进行正则匹配和清洗处理,从而极大的增加了logstash的压力 所以我们Nginx 的日志修改为json ...
- KubeOperator安装好后默认会占用80端口,替换成其他端口
使用KubeOperator安装好k8s后,然后修改如下的配置文件,最后重启应用即可 重启:koctl restart
- 如何在 Docker 之上使用 Elastic Stack 和 Kafka 可视化公共交通
文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106498568 需要掌握的知识点: 1.使用docker-compose方式部署一套 ...
- Maven快速配置和入门
概念 Maven其实就是一个管理项目.构建项目的工具.它有标准化的项目结构.构建流程.依赖管理. 功能 Maven提供了一套标准的项目结构 Maven提供了一套标准的构建流程 Maven提供了更便捷的 ...