首页 > 其他分享 >ABAP 调用HTTP上传附件(二)之中文乱码

ABAP 调用HTTP上传附件(二)之中文乱码

时间:2023-06-13 14:05:43浏览次数:38  
标签:lv full HTTP name format url 乱码 ABAP escape

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

但是上传的文件名全部变成了如图所示

 

ABAP 调用HTTP上传附件(二)之中文乱码_ABAP

直接发送中文名称,并在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

函数转换完,扩展名的“.”都被转换了。额……继续研究

ABAP 调用HTTP上传附件(二)之中文乱码_文件名_02

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_03

 

标签:lv,full,HTTP,name,format,url,乱码,ABAP,escape
From: https://blog.51cto.com/BinGeneral/6469172

相关文章

  • ubuntu解压ZIP文件名乱码问题
    背景一个windows压缩的zip文件,再ubuntu中解压后,文件名全是乱码,试过很多GBK、UTF-8的转换方法后找到该方法解决办法安装包sudoapt-getinstallunar使用假设需要解压的ZIP包是foo.zip列出所有文件lsarfoo.zip>如果列出的文件名已经正确解压所有文件unarfoo.z......
  • 什么是HLS(HTTP Live Streaming)?
    HLSEasyTech#013#2009年,Apple推出了HLS(HTTPLiveStreaming)——基于HTTP的自适应码率流媒体传输协议。HLS描述了一组通过互联网提供音视频服务的工具和程序。一个视频可以被分割成多个视频切片,这些切片的传送位置和顺序在一组被称为播放列表的XML文件中,该文件以文件扩展名m3u8结尾......
  • HTTP/3特性分析及未来发展
    Robin讲HTTP/3#005#到现在为止,我们主要对比了QUIC和TCP中的性能特性。那么HTTP/3和HTTP/2之间的区别是什么?我们在第一部分讨论过,HTTP/3实际上是HTTP/2-over-QUIC,所以新版本中并没有推出什么真正重要的新特性。这与从HTTP/1到HTTP/2不同,其中的变化更多,并推出了如头压缩、流优先级和......
  • 使用RestTemplate发送http请求导致请求头被过滤
    问题描述:  服务内需要使用http请求访问第三方接口,由于安全问题,第三方接口为防止跨域问题,在Nginx增加了请求头(Host,Origin,Refere)判断规则,判断不通过便返回404。一次调用过程,确保请求地址,请求头,参数均没问题后,却一直404。 原因:  RestTemplate中默认使用的connector会......
  • ABAP分批取数
    1.通过分包取数SELECT*FROMTABPACKAGESIZE1000“循环的操作放在中间ENDSELECT.2.用过游标取数DATA:LV_CURTYPECURSOR.OPENCURSOR:LV_CURFORSELECT*FROMTABFETCHNEXTCURSORLV_CURINTOTABLEGT_UPDATECLOSECURSORLV_CUR. ......
  • 计算机网络协议之http协议(四)
    一、HTTP协议概述HTTP协议又称超文本传输协议,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。HTTP协议的特点如下:基于客户/服务器模式。在HTTP/0.9和1.0中每次连接只处理一个请求。服务器不保留与客......
  • QT的http post
    QT+=network#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QWidget>#include<QObject>#include<QDebug>#include<QHttpMultiPart>#include<QNetworkAccessManager>#include<QNetw......
  • python使用HTTP隧道代理代码示例模板
    以下是使用HTTP隧道代理的Python代码示例模板:```pythonimportrequests#设置代理服务器地址和端口号proxy_host="your_proxy_host"proxy_port="your_proxy_port"#设置代理服务器的用户名和密码(如果需要)proxy_username="your_proxy_username"proxy_password="your_proxy_p......
  • PHP使用HTTP隧道代码示例模板
    以下是使用PHP实现HTTP隧道的代码示例模板:```php<?php//目标网站的URL$targetUrl='ExampleDomain';//获取客户端请求的HTTP方法和请求头$method=$_SERVER['REQUEST_METHOD'];$headers=getallheaders();//创建与目标网站的连接$ch=curl_init();curl_setopt($ch,CURLOPT......
  • 13、镜像仓库Habor的安装、高可用、https加密
    Docker之分布式仓库Harbor安装Harbor下载地址:https://github.com/vmware/harbor/releases安装要求:4CPUMEM:8GBDISK:160GB环境准备:四台主机两台主机harbor服务器,地址10.0.0.101|102两台主机harbor客户端上传和下载镜像一键安装docker、docker-compose、harbor脚本#!/bi......