这是 Jerry 2021 年的第 71 篇文章,也是汪子熙公众号总共第 348 篇原创文章。
Jerry 之前发布过一篇文章 不使用任何框架,手写纯 JavaScript 实现上传本地文件到 ABAP 服务器,之后不少朋友留言,提出的问题概括为以下两类:
(1) 客户端通过 multipart/form-data 格式发送的数据,ABAP 端除了像 Jerry 文章采取字符串解析这种比较繁琐的方式处理外,还有其他方法吗?
(2) 能否上传二进制文件比如 Excel 到 ABAP 并进行解析?
使用 JavaScript 通过 multipart/form-data 格式发送 PDF 和 Excel 文件到 ABAP 服务器
关于 multipart/form-data 格式的详细说明,参考 Mozilla 开发社区和 W3 Org 的文档:
https://developer.mozilla.org/en-US/docs/Web/API/FormData/Using_FormData_Objects
https://www.w3.org/html/wg/spec/association-of-controls-and-forms.html#multipart-form-data
我在前文例子的基础上稍作修改,在 Form 里使用两个类型为 file 的 input 标签,分别上传 PDF 和 Excel 文件:
现在已经有很多开源工具比如 JavaScript 库可以用来生成和解析 PDF 文件了,感兴趣的朋友可以在搜索引擎里搜索 Jerry 这几篇文章:
使用 ABAP 和 JavaScript 代码生成 PDF 文件的几种方式
使用 JavaScript 将当前页面保存成 PDF,支持图片和文字的保存
PDF 文件如何转成 markdown 格式
对于上传到 ABAP 服务器的 PDF 文件的文件名,我们仍然采取和前一篇文章同样的方式解析,从下图红色矩形框中的字符串中提取。
当 ABAP 服务器接收到的客户端数据格式为 multipart/form-data 时,调用 CL_HTTP_REQUEST 的num_multiparts 方法可以得到 parts 的个数,再使用 get_multipart 方法,传入每个 part 的索引,就可以得到代表这个 part 的一个实例引用。
调用该引用的get_content_type 和 get_data 方法,就能解析出上传文件的类型(比如 pdf 格式对应的 application/pdf)和二进制内容。
至此调用 SAP CRM 附件创建 API 的三大参数:文件名,文件类型和文件二进制内容均已就绪,调用 API 即可将上传的 PDF 和 Excel 数据,创建成为 SAP CRM 销售订单的附件。
如何使用 ABAP 解析上传的 Excel 文件
这个话题,其实 Jerry 2019 年的文章 使用ABAP操作Excel的几种方法 已经系统介绍过。
我们在 ABAP 调试器里观察到,本地扩展名为 xlsx 的 Excel 文件,上传到 ABAP 服务器时,其 content-type 为:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet