这是 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…
- https://www.w3.org/html/wg/sp…
我在前文例子的根底上稍作批改, 在 Form 里应用两个类型为 file 的 input 标签,别离上传 PDF 和 Excel 文件:
用来测试的本地 PDF 文件:PDF.pdf,大小为 30129 字节。
内容如下:
本地用来测试的 Excel 文件:TEST.xlsx,内容如下:
点击 HTML 页面上传文件的超链接,在 Chrome 开发者工具察看到 HTTP POST 申请的负载,蕴含了 PDF 和 Excel 两个 input 控件蕴含的二进制流(stream):
点击 view source,查看 multipart/form-data 数据明细:
咱们依然能够在 Chrome 开发者工具里察看到上传的 PDF 和 Excel 的文件名和 Content-Type 即文件类型。同前文上传文本文件的例子不同,这里无奈看到两个文件的二进制内容——这些二进制内容能够在 ABAP 服务器端调试器里察看到。
以上传的 PDF 文件为例,在 ABAP 服务器端接管到的 form-data 数据,如下图所示,绿色高亮区域即为上图 Chrome 开发者工具里可能观测到的文件名 PDF.pdf 和文件类型 application/pdf, 而 %PDF-1.4# 结尾的,就是 PDF 文件的二进制内容。
精确的说,PDF 格局是文本和二进制流的混合模式。用文本编辑器关上 PDF.pdf, 能看到其文件头部蕴含的是文本字符形容的文件元数据,比方该文件的创立和批改工夫,创立该文件的工具名等等,后半局部才是二进制流。
当初曾经有很多开源工具比方 JavaScript 库能够用来生成和解析 PDF 文件了,感兴趣的敌人能够在搜索引擎里搜寻 Jerry 这几篇文章:
- 应用 ABAP 和 JavaScript 代码生成 PDF 文件的几种形式
- 应用 JavaScript 将以后页面保留成 PDF,反对图片和文字的保留
- PDF 文件如何转成 markdown 格局
对于上传到 ABAP 服务器的 PDF 文件的文件名,咱们依然采取和前一篇文章同样的形式解析,从下图红色矩形框中的字符串中提取。
而对于上图绿色高亮的 PDF 的二进制数据,CL_HTTP_REQUEST 提供了相应办法来提取。要害代码如下图所示:
当 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 销售订单的附件。
创立好的 PDF 和 Excel 附件在 SAP CRM 零碎里显示如下:
关上这两个附件,确保上传之后,其内容同本地文件完全一致:
如何应用 ABAP 解析上传的 Excel 文件
这个话题,其实 Jerry 2019 年的文章 应用 ABAP 操作 Excel 的几种办法 曾经零碎介绍过。
咱们在 ABAP 调试器里察看到,本地扩大名为 xlsx 的 Excel 文件,上传到 ABAP 服务器时,其 content-type 为:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
什么是 openxmlformats?上面通过具体的例子来阐明。
以我这个本地 Excel 文件为例,将扩展名从 xlsx 更改为 zip,而后解压:
发现 xlsx 文件其实是一个压缩包,解压之后生成了一个文件夹,蕴含了下图所示的若干子文件夹和文件。
上图 Excel 文件有一个名为 Sheet1 的内容页,A1 值为 ABAP,B1 值为 Java,这个信息保护在解压进去的 worksheets 文件夹的子文件 sheet1.xml 内:
上图高亮的 XML c 节点代表 Cell,r=”A1″ 和 r=”B1″, 代表这两个 cell 所在的 Row ID,c 的子节点 v 蕴含了 Cell 的具体值。
不难发现,sheet1.xml 里并未间接将 ABAP 和 Java 的字符串字面量在内,而仅仅寄存了其索引,0 和 1. 做过 Java 开发的敌人,能够把这种设计类比成 Java 的字符串常量池。
在解压出的文件夹里有另一个文件 sharedStrings.xml, 顾名思义,保护了 Excel worksheets 里呈现的所有字符串,用于在 sheets 之间共享。每个独自的 sheet xml 文件只保护应用到的字符串的索引,以减小 Excel 文件的尺寸。
因而,只有相熟了 TEST.xlsx 重命名为 TEST.zip 并解压之后生成的每一个文件的用处,即 Open XML Formats 的协定标准,就能够应用任何高级编程语言解析 Excel 文件。
能够在 WikiPedia 里找到 Open XML Formats 协定定义的每个文件的作用:
https://en.wikipedia.org/wiki…
SAP CRM 提供了一个工具类,基于 Open XML Formats 解析 Excel 文件内容:cl_xlsx_document.
只需将 Excel 文件的二进制内容传入,该工具类即返回一个 Excel 文件的援用,依据该援用的各种 GET 办法,即可拜访到 Excel 文件内由 Open XML Formats 协定定义的各个局部的内容。
外围逻辑如下图所示,代码都是自描述的,这里不再赘述。
当然,开源我的项目 abap2xlsx 也是另一个抉择:
https://github.com/sapmentors…
至于 SAP Fiori 利用通过 SAP Gateway 上传附件的技术细节,Jerry 未来会介绍。
本文波及到的前后端残缺源代码,请在这个链接处下载。
感激浏览。
Jerry 的 ABAP 专题
- Jerry 的 ABAP, Java 和 JavaScript 乱炖
- ABAP 开发人员将来应该学些什么
- Jerry 2017 年的五一小长假:8 种经典排序算法的 ABAP 实现
- Jerry 的 ABAP 原创技术文章合集
- 300 行 ABAP 代码实现一个最简略的区块链原型
- 应用 Java+SAP 云平台 +SAP Cloud Connector 调用 ABAP On-Premise 零碎里的函数
- 在 SAP 云平台的 CloudFoundry 环境下生产 ABAP On-Premise OData 服务
- ABAP vs Java,蛙泳 vs 自由泳
- 聊聊 C 语言和 ABAP
- 入手应用 ABAP Channel 开发一些小工具,晋升日常工作效率
- 我用 ABAP 做过的那些无聊的事件
- 不喜爱 SAP GUI?那试试用 Eclipse 进行 ABAP 开发吧
- 应用 Visual Studio Code 编写和激活 ABAP 代码
- 你的 ABAP 程序给佛祖开过光么?来试试 Jerry 这个小技巧
- 在 SAP 云平台 ABAP 编程环境上编写第一段 ABAP 程序
- SAP 官网公布的 ABAP 编程标准
- ABAP Code Inspector 那些暗藏的性能,您都晓得吗?
- 还在用 ABAP 进行 SAP 产品的二次开发?来理解下这种全新的二次开发理念吧
- ABAP Netweaver 体内的那些寄生式编程语言
- 从 SAP 社区上的一篇博客开始,聊聊 SAP 产品命名背地的那份情怀
- 云端的 ABAP Restful 服务开发
- 如何在 SAP 云平台 ABAP 编程环境里把 CDS view 裸露成 OData 服务
- 应用 abapGit 在 ABAP On-Premises 零碎和 SAP 云平台 ABAP 环境之间进行代码传输
- 30 分钟用 Restful ABAP Programming 模型开发一个反对增删改查的 Fiori 利用
- Jerry 带您理解 Restful ABAP Programming 模型系列之二:Action 和 Validation 的实现
- Jerry 带您理解 Restful ABAP Programming 模型系列之三:云端 ABAP 利用调试
- SAP 云平台上的 ABAP 编程环境里如何生产第三方服务
- ABAP 开发者上云的时候到了 – 当初大家能够收费应用 SAP 云平台 ABAP 环境的试用版了
- 学而不思则罔 – SAP 云平台 ABAP 编程环境的由来和实用场景
- SAP 云平台里的三叉戟利用
- 如何基于 Restful ABAP Programming 模型开发并部署一个反对增删改查的 Fiori 利用
- SAP 2019 TechEd Key Note 解读:云时代下 SAP 从业人员如何做二次开发?
- 有哪些 ABAP 关键字和语法,到了 ABAP 云环境上就没方法用了?
- ABAP 开发环境终于反对以驼峰命名法主动格式化 ABAP 变量名了
- 利用 ABAP 740 的新关键字 REDUCE 实现一个理论工作工作
- 一段让人瑟瑟发抖的 ABAP 代码
- 昨日万圣节 ABAP 怪兽级代码谜团,颁布答案啦
- 介绍一种在 ABAP 内核态进行内表高效拷贝的办法
- 应用 SAP Cloud Application Programming 模型开发 OData 的一个理论例子
- 当 ABAP 遇见普罗米修斯
- 应用 ABAP 绘制可伸缩矢量图
- ABAP 开发环境语法高亮的那些事儿
- SAP 谬误音讯调试之七种武器:让所有的谬误音讯都能被定位
- 应用 ABAP 操作 Excel 的几种办法
- SAP GUI 里的收藏夹事务码管理工具
- SAP GUI 和 Windows 注册表
- 有了 Debug 权限就能干坏事?小心了,你的一举一动尽在系统监控中
- ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX 这些东东是什么鬼
- 实现 ABAP 条件断点的三种形式
- 应用 SAT 跟踪监控从浏览器关上的 SAP 利用的性能和调用栈
- 一个 13 年 ABAP 老兵的倡议:理解这些基础知识,对 ABAP 开发有百利而无一害
- SAP ABAP Netweaver 容器化, 不可能实现的工作吗?
- SAP 产品加强技术回顾
- SAP API 开发方法大全
- 浅谈 Java 和 SAP ABAP 的动态代理和动静代理,以及 ABAP 面向切面编程的尝试
- SAP ABAP 应用服务器的 HTTP 响应状态码(Status Code)
- SAP ABAP 里存在 Java List 这种汇合工具类么?CL_OBJECT_COLLECTION 理解一下
- ABAP 面试题系列:写一组会呈现死锁 (Deadlock) 的 ABAP 程序
- SAP ABAP Netweaver 服务器的规范登录形式解说
- SAP ABAP 关键字语法图和 ABAP 代码主动生成工具 Code Composer
- SAP ABAP SM50 的另类用处 – ABAP 工作过程对数据库表读取操作的检测
- 对于 SAP ABAP 字符变量和字符串变量字符个数的一个知识点,和一个血案
- SAP ABAP 一组关键字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 的用法辨析
- SAP ABAP 和 Java 里的弱援用 (WeakReference) 和软援用(SoftReference)
- SAP AMDP 介绍 – ABAP 托管的 HANA 数据库过程
- 给你的 ABAP 对象打上标签(Tag)
- 历史上的明天:编程语言中 null 援用的十亿美元谬误
- ABAP Development Tool 代码模板和其余一些实用技巧汇总
- SAP ABAP Development Tool 进步开发效率的十个小技巧
- 如何在 SAP BTP 平台 ABAP 编程环境里生产基于 SOAP 的 Web Service
- ABAP 真的会过期吗?聊聊 ABAP 的过来,当初和将来
- 基于 abapGit 和 abaplint 的 ABAP 继续集成的一个例子
- 不应用任何框架,手写纯 JavaScript 实现上传本地文件到 ABAP 服务器
更多 Jerry 的原创文章,尽在:” 汪子熙 ”: