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格式内容中有类似的 ...
随机推荐
- 逆向学习物联网-网关ESP8266-05课程小结
1. 移花接木 本章利用自己设计的网关代替体验系统中的网关,开启了分模块设计系统的设计模式. 2.透明传输 终端传输来的数据,以MQTT协议透明传输到云及其他订阅者,简化终端系统的设计. 3. 利用状 ...
- FFmpeg 摄像头采集
FFmpeg 摄像头采集 extern "C" { #include "libavcodec/avcodec.h" #include "libavfo ...
- mysql查询锁表和表解锁的操作
转载自:https://www.cnblogs.com/qianxiaoruofeng/p/15542468.html 第一种 1.查询是否锁表 show OPEN TABLES where In_u ...
- C# 自定义组元扩展类(Tuple)
组元Tuple没有构造函数,自定义一个有构造函数的组元TupleEx. namespace TupleEx { public class TupleEx<T1> { /// <sum ...
- 将Vue项目部署到Nginx中,出现的400,405,200响应空等问题处理
最近用Vue3写了个项目,然后对接后台接口. 在本地vue配置文件中,配置了反向代理.成功请求了后端接口. 自测没有问题. 打包vue,发布到nginx中.运行nginx,成功显示了页面. 当点击页面 ...
- 导入maven包时,非常慢的解决方案
在导入maven包时,很多时候导的很慢,导致找不到包,需要将maven包下载地址替换为aliyun的地址,以下为解决方案 找到使用的maven地址,在文件内添加以下节点然后重启ide即可 <mi ...
- Lua元表应用举例:配置表格转为Lua配置表
把配置表格.xlsx数据转为Lua配置表,其实就是把表格数据用Lua写一遍,这里的实现重点就是setmetatable设置元表. 以下以表格student_info.xlsx举例,展示对应Lua配置表 ...
- 8.forEach的使用
1 List<customer> list //一个类是customer的列表 2 3 /* for(int i = 0;i < list.size();i++){ 4 System ...
- sql server 索引检测
-- 声明表变量 DECLARE @userTable TABLE (table_name NVARCHAR(20)); -- 将源表中的数据插入到表变量中 INSERT INTO @userTabl ...
- CC协议的诞生背景
CC协议的诞生背景 在当今世界绝大部分国家的法律法规中,作品的版权一般都保留于创造者或拥有人手中,在没有特殊声明的情况下,任何人想要获取或使用该作品,都要事先取得版权所有者的授权,才可以进行合法的获取 ...