SAP ABAP 企业微信服务端 API > 消息推送 > 发送应用消息 > 文件消息:上传临时素材中文名称乱码 [ 未解决,待更新 ]
简介: 企业微信上传临时素材中文名称乱码,ABAP 实现问题未解决,用 JAVA 等语言的实现应该没问题。这篇文章是我的一些开发记录,谨以此留待同道中人继续研究。
关键字:SAP
ABAP
企业微信
服务端 API
上传文件
中文名称乱码
消息推送
文章目录
1 企微服务端 API
API 按调用次序:
- (1)企业微信开发者中心 -> 服务端API -> 开发指南 -> 获取access_token
- (2)企业微信开发者中心 -> 服务端API -> 素材管理 -> 上传临时素材
- (3)企业微信开发者中心 -> 服务端API -> 消息推送 -> 发送应用消息 -> 文件消息
2 中文名称乱码
不影响打开,但影响实际应用!
3 基于 ABAP 实现的问题分析
- 官方请求示例
POST https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=accesstoken001&type=file HTTP/1.1
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
Content-Length: 220
---------------------------acebdf13572468
Content-Disposition: form-data; name="media";filename="wework.txt"; filelength=6
Content-Type: application/octet-stream
mytext
---------------------------acebdf13572468--
- ABAP 请求示例(原始请求)
lv_name = lv_filename.
lv_value = 'form-data; name="media"; filename="' && lv_name && '"'.
call method lo_part->set_header_field
exporting
name = 'content-disposition'
value = lv_value.
- ABAP 请求示例(按最可能正确的方向改进)
尝试字符集编码识别,结果失败。
lv_name = lv_filename.
lv_name = escape( val = lv_name format = cl_abap_format=>e_uri_full ).
lv_value = `form-data; name="media"; filename*=UTF-8''` && lv_name.
call method lo_part->set_header_field
exporting
name = 'Content-Disposition'
value = lv_value.
尝试使用IF_HTTP_UTILITY~CONTENT_DISPOSITION_FILENAME
,无效,且 SAP Support 有好几个需要实施的 Note 如 2260256,果弃。
[ filename*=UTF-8'' && lv_name ] 这类处理其实依赖服务端是否支持解析。
4 Postman 测试用例和请求内容跟踪
Postman 测试结果正常,中文名称 OK !
5 一些解决过程的参考文章
- Stack Overflow > how to set chinese filename correctly for different browsers when download file
- SAP Community > ABAP HTTP body Chinese characters garbled code
其中,这里有些说法我觉得很有意思,
按照这篇社区文章的说法,基本结论就是依赖服务端的处理。
6 在 JAVA 中是怎么解决的?
- 使用 MultipartEntityBuilder 类上传
//解决企业微信中文乱码问题,设置编码格式
MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
builder.addBinaryBody("media", file, ContentType.DEFAULT_BINARY, encodedFilename);
HttpEntity reqEntity = builder.build();
// 定义数据分隔线
httpPost.setEntity(reqEntity);
httpResponse = httpPost.execute(httpMethod);
- 在 ABAP 中如何实现下图的 JAVA ?特别是
enc:"UTF-8"
,
7 一些没什么用的记录
- SPAD 设置假脱机字符集、代码页
- SAP LOGON > 属性 > 代码页
- IF_HTTP_UTILITY~GET_LOGON_CHARSET
- 更改应用服务器的字符集为 UTF-8 ???
不做尝试,越界,但附上可能的操作,
SAP Help Portal (Documentation) > 选择服务器缺省字符集 - IF_HTTP_UTILITY~ESCAPE_URL
8 在企微开发者社区提 Case
企微开发者社区 > 服务端API发送文件消息文件中文名乱码?
右侧还很多同质问题,
9 总结
我真诚的建议:转向 JAVA 平台发布 API 服务跳板。
- 在 ABAP 中实现 JAVA 功能(详见第 6 节)。
- 企微应该不支持解析,无论是对 filename 的 header field 再指定,还是字符集转换。
- 企业微信的技术支持实在是太烂了!找不到一个人工客服,只能以 Case 方式提问,完全没效率,遇到问题你甚至会生出变更合作伙伴,弃暗投明的想法。
- 这个问题把我整挺崩溃,如果你在 ABAP 中解决了这个问题,一定要在留言回复我来围观!提前感谢你。
对酒当歌,人生几何!譬如朝露,去日苦多。
其他
我的微信群、QQ群和其他发布平台。
长期提供开发和运维服务。