ABAP 调用HTTP上传附件(二)之中文乱码
1、这篇文章的由来
之前已经发表了《ABAP 调用HTTP上传附件》的文章,详细介绍了如何通过HTTP请求传输附件,可点击链接参考原有文档
因为之前对传输文件的中文文件名处理上解释不够详细,也因为不够重视,导致又一次在相关问题上踩坑。而浪费一天时间的问题,最终原因竟然就是个这?哭笑不得!目瞪口呆!
为以上缘由,也因为只有“身体力行”的研究,才会更加深入的学习问题相关的知识,才能优化自己解决问题的思路和方法,无论这个方法论是“经验所得”还是他人的“言传身教”,都是比解决问题本身更有价值的收获。
所以写这篇文档,介绍一下解决中文乱码问题的整个过程。
2、详细说明
2.1、问题背景
在《ABAP 调用HTTP上传附件》文章中对于中文乱码问题已经做了解释:
"拼接上传的文件名,并将文件名转码
lv_name = i_filename.
lv_name = cl_http_utility=>escape_url( lv_name ).
lv_value = 'form-data; name="file"; filename="' && lv_name && '";'.
此代码cl_http_utility=>escape_url( lv_name )的作用是将中文转码:
转换前:'测试文件.txt'.
转换后:%e6%b5%8b%e8%af%95%e6%96%87%e4%bb%b6.txt
但是上传的文件名全部变成了如图所示

直接发送中文名称,并在HTTP中设置UTF-8,没有解决问题,所以只能继续在转码上研究
2.2、解决过程
2.2.1、发现异常
在POSTMAN中上传文件测试正常。
因为此接口经过CPI,在POSTMAN中没有发现有价值信息,而在CPI中发现了POSTMAN上传和代码上传的日志有所不同
POSTMAN:
Content-Disposition: form-data; name="file"; filename="测试文件.txt";
filename*=UTF-8''%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.txt
代码调用:
content-disposition: form-data; name="file"; filename="%e6%b5%8b%e8%af%95%e6%96%87%e4%bb%b6.txt";
除了POSTMAN调用时多了filename*用来将文件名转换为UTF-8的中文名外,对应的中文文件名编码,一个字母全部大写,一个字母全部小写……
因为JAVA环境调用正常,所以在JAVA环境中代码模拟:
URI uri = null;
try {
uri = new URI(null, null, "测试文件.txt", null);
} catch (URISyntaxException e) {
e.printStackTrace();
}
String fileName = uri.toASCIIString();
System.out.println(fileName); 结果:
%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.txt
至此,回想起研究RSA加密时,也发现了ABAP中用此方法直接转换编码时,得到的ASCII值为小写。而当前对接的外围系统无法解析字母为小写的这串编码,所以最终上传的文件名就都变成了编码符号,真相大白!真相大白!真相大白!
2.2.2、解决问题
开始研究ABAP的编码转换方法:
1、直接转大写
除了过于简单粗暴外,还需要截取字符串,否则将文件后缀也变成了大写,如TXT,XLSX等,额……对于强迫症患者,还是算了
2、函数www_urlencode
函数转换完,扩展名的“.”都被转换了。额……继续研究

3、预定义函数escape
此函数可以通过定义format = cl_abap_format=>e_url_full,得出和Java代码中同样的效果,其实cl_abap_format=>e_uri_full在此处也满足需求,两者在符号“+”、“*”、“~”上有转换区别
lv_name = escape( val = lv_name format = cl_abap_format=>e_url_full ).
几种编码测试对比:
一、
lv_name = '测试文件.txt'.
DATA(lv_name1) = escape( val = lv_name format = cl_abap_format=>e_uri_full ).
DATA(lv_name2) = escape( val = lv_name format = cl_abap_format=>e_url_full ).
DATA(lv_name3) = cl_http_utility=>escape_url( lv_name ).
WRITE:/ 'escape e_uri_full:' && lv_name1.
WRITE:/ 'escape e_url_full:' && lv_name2.
WRITE:/ 'escape_url 小写:' && lv_name3. 结果:
escape e_uri_full:%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.txt
escape e_url_full:%E6%B5%8B%E8%AF%95%E6%96%87%E4%BB%B6.txt
escape_url 小写:%e6%b5%8b%e8%af%95%e6%96%87%e4%bb%b6.txt 二、
lv_name = '+'.
DATA(lv_name1) = escape( val = lv_name format = cl_abap_format=>e_uri_full ).
DATA(lv_name2) = escape( val = lv_name format = cl_abap_format=>e_url_full ).
WRITE:/ 'escape e_uri_full:' && lv_name1.
WRITE:/ 'escape e_url_full:' && lv_name2.
结果:
escape e_uri_full:%2B
escape e_url_full:+
最终使用预定义函数escape解决问题,文件名称正常

ABAP 调用HTTP上传附件(二)之中文乱码的更多相关文章
- ABAP 调用HTTP上传附件
1.需求说明 在SAP中调用第三方文件服务器的HTTP请求,将文件保存在文件服务器上,并返回保存的文件地址.SAP保存返回的文件地址,通过浏览器进行访问. 2.需求实现 2.1.POSTMAN测试 通 ...
- 解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
目前比较流行的是使用SWFUpload控件,这个控件的详细介绍可以参见官网http://demo.swfupload.org/v220/index.htm 在使用这个控件批量上传文件时发现中文文件名都 ...
- 黄聪:wordpress前台自定义用户,调用wp_editor上传附件提示【抱歉,出于安全的考虑,不支持此文件类型】错误。
1.直接禁用文件类型检测,在wp-config.php文件中,添加这样一句代码define('ALLOW_UNFILTERED_UPLOADS', true); 2.在functions.php里面, ...
- 【问题解决方案】本地代码文件上传到GitHub里中文乱码问题
刚刚学完Git并试着上传了我的化石Java代码到远程库,表面一切和谐,然而.. 真让人大惊失色.. step1-检查浏览器是否是utf-8(谷歌默认是) step2-在本地编辑器设置 (按理说,not ...
- java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题
//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...
- 向hive上传数据时,中文乱码
sudo -u hive hive -e "use dataplat;load data local inpath '/home/dlht/data/test/2_times.csv' ov ...
- servlet上传多个文件(乱码解决)
首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar, 可百度下下载,然后你编码完成后,上传 ...
- jeecms系统使用介绍——通过二次开发实现对word、pdf、txt等上传附件的全文检索
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76912307 本文出自[我是干勾鱼的博客] 之前在文章<基于Java的门户 ...
- webservice跨服务器上传附件
最近一个项目,用到文件上传功能,本来简单地使用upload控件直接post到服务器保存,简单实现了.后来考虑到分布是部署,静态附件.图片等内容要单独服务器(命名为B服务器,一台,192.168.103 ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
随机推荐
- 实验:STM32F103烧写支持Arduino
1.搭建烧写环境 烧写器:ST-LINK. 2.启动stm32 flash烧写工具 3.连接识别CPU 4.打开generic-boot20_pc13.bin 5.烧写程序 6.查上miniUS ...
- 逆向学习物联网-网关ESP8266-00课程目的
- Java-Java数据类型对应MySql数据类型
开发过程中常用的数据类型: Java Mysql 备注 整型 java.lang.Integer tinyint(m) 1个字节 范围(-128~127) java.lang.Integer ...
- 网络层-ICMP
为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP ICMP报文被封闭在IP数据报中发送 封包格式 主机或路由器使用ICMP来发送差错报告报文和询问报文 差错报告报 ...
- Spark RDD编程
1. 准备文本文件从文件创建RDD lines=sc.textFile()筛选出含某个单词的行 lines.filter()lambda 参数:条件表达式 2. 生成单词的列表从列表创建RDD wor ...
- 关于js闭包的基础理解
闭包 拿一个可以记录函数调用次数的来进行理解,如下方 let n = 0 function numUp(){ n++ console.log(n) } const fn = numUp() fn() ...
- 西瓜书 5.5 编写过程(标准BP与累计BP)
话不多说先用numpy表示出数据集 Y=['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率','好瓜与否']D=np.array([[2,1,2,3,3,1,0.697, ...
- uniapp 全局注册组件注意事项
标准 根目录components 文件夹下建立 组件文件名文件夹 然后组件 autoscan 打开 别的用不到不写 全局使用 备注 因为不是vuecli 项目 只在H5 端生效 在app 上生 ...
- 连接打印机Lodop
<div class="panel-body"> <div class="row show-grid"> <div class=& ...
- 更多Linux实用命令
更多实用命令 进程相关 当程序运行在系统上时,我们称之为进程(process).想监测这些进程,需要熟悉 ps/top 等命令的用法.ps 命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许 ...