不使用任何框架,纯手工编写JavaScript,将本地文件上传到ABAP服务器。使用SAPUI5的sap.ui.unified.FileUploader控件,结合Gateway框架,将本地文件上传到ABAP服务器并不难。但是由于项目实施的客观条件,不使用SAPUI5和SAPABAPGateway这两个框架怎么实现呢?这是最近有朋友问我的问题。其实早在2014年我就做过类似的事情。本文介绍了在不使用SAPUI5和SAPABAPGateway框架的情况下实现文件上传所需的步骤,纯手工前后端编程。本文提供的源代码,前端JavaScript代码和后端ABAP服务器的文件接收代码,可以在任何基于ABAP技术栈的SAPOn-Premises产品中运行,因为它没有使用任何应用程序——级框架。我们从前后端层的实现上了解这个需求的实现细节。前端代码前端实现比较简单,只有30行代码。创建一个新的HTML文件并将这30行代码粘贴到其中。其设计思路归纳为以下7点。需要完整源码的朋友,请从这个链接获取。(1)定义一个原生的表单元素,使用enctype字段指定发送到服务器的表单的编码格式为multipart/form-data。(2)表单的数据使用HTTPPOST方式发送到服务器。(3)表单包含三个输入控件,类型分别为email、文本和文件。本文介绍的本地文件上传功能是借助第8行的类型为file的input控件完成的,点击第11行a标签实现的超链接后,触发a标签绑定的sendForm函数发送数据。(4)通过DOMAPIdocument.forms.namedItem解析表单form中的所有数据,放入变量oData中。(5)第17行的语句演示了通过代码将表单数据发送到服务器的方式,以及添加新内容的方法。(6)这一行维护了表单数据发送到ABAP服务器的具体地址,其SICF路径为/sap/crm/file_upload。文件上传到ABAP服务器后,我们如何验证上传是否成功,内容是否正确?出于验证目的,我硬编码了一个销售订单ID55824。文件上传成功后,我将上传的文件创建为SAPCRM系统中销售订单的附件。(7)调用原生APIXMLHttpRequest的send方法将表单数据发送到ABAP服务器。打开这个HTML文件,如下图所示,点击超链接上传文件。待上传的文本文件内容如下:ABAP后端实现因为我们没有使用任何后端框架,这意味着我们必须根据底层HTTP协议解析出客户端发送的multipart/form-data格式的数据并进行处理。首先,在事务代码SICF中,根据前端代码中的路径sap/crm/file_upload,新建一个相同路径的处理节点。关于SICF的更多介绍可以参考Jerry的文章:从ABAPNetweaver的SICF到SAPKyma的LambdaFunction。为此节点创建一个处理类ZCL_FILE_UPLOAD。本文所有的后端处理逻辑都写在这个类的HANDLE_REQUEST中。完整的后台代码也可以从这个链接获取。本文不一一贴出,只介绍其中的要点。前端Form表单的三个输入控件维护的输入值,加上前端代码中的自定义表单数据,由浏览器随机生成的FormBoundary分隔。提交表单的完整数据可以在ChromeDeveloperToolsNetwork选项卡中观察到。ZCL_FILE_UPLOAD类的实现逻辑是先解析出浏览器发送过来的FormBoundary标识,根据这个Boundary,将接收到的表单数据拆分成块,然后只处理包含我们感兴趣的本地文件上传的块.我们刚刚展示了如何在Chrome开发者工具中查看发送到ABAP服务器的表单数据的详细信息。ABAP服务器收到数据后,在调试器中显示如下:这些井号是什么意思?使用上图高亮显示的下拉菜单将FastDisplay切换为HTMLBrowser,一目了然。原来这些换行、回车换行等控制字符在ABAP调试器的FastDisplay视图中统一显示为“#”。我真正感兴趣的上传文件的实际内容存储在下图所示的表单数据块中。因此,我的想法是根据回车和换行定位到上面ABAP变量LV_DATA中包含的form-data块。如果该块包含content-type:text/plain,则表示该块包含上传文件的实际内容。content,分析得到上传文件的实际内容。这里很多新手朋友常犯的错误是因为在ABAP调试器中观察到的回车换行符显示为“##”,所以在代码中,这些朋友也直接使用了单井号或者双井号。字符串匹配,当然不行。为了在ABAP中进行换行和回车换行相关的操作,需要用到ABAP工具类CL_ABAP_CHAR_UTILITIES定义的常量:CR_LF和NEWLINE:就像我在本文实现代码中的使用方式:之后解析上传的文本文件内容,调用SAPCRM附件创建API,将文件内容作为附件添加到系统ID为55824的销售订单中。为了简单起见,本例只支持本地文件作为销售订单附件上传的文本类型(text/plain)(其BOR类型为BUS20000115),因此文件类型和BOR类型都是硬编码的。前后端开发完成后,进行测试,从本地上传一个名为upload.txt的文本文件,ABAP服务器接收后,存储为销售订单55824的附件。点击附件中的超链接打开文件内容,发现和本地文件一模一样,测试通过:当然,本文描述的其实是重新发明轮子的场景。在实际项目开发中,如果没有特殊原因,尽量使用SAP提供的现成的框架和工具来完成文件上传等比较基础和底层的工作,从而专注于业务的编写逻辑。谢谢阅读。Jerry'sABAP专题Jerry'sABAP,Java和JavaScript炖煮ABAP开发者未来应该学什么Jerry's2017年五一假期:8种经典排序算法的ABAP实现Jerry'sABAP原创技术文章合集300行ABAP代码实现最简单的区块链原型之一使用Java+SAP云平台+SAPCloudConnector调用ABAPOn-Premise系统中的函数在SAP云平台的CloudFoundry环境中消费ABAPOn-PremiseOData服务ABAPvsJava,蛙泳vsfreestyle聊聊C语言和ABAP实战使用ABAPChannel开发一些小工具,提高日常工作效率那些用ABAP做过的无聊事不喜欢SAPGUI?然后尝试使用Eclipse进行ABAP开发。使用VisualStudioCode编写和激活ABAP代码。你的ABAP程序悟佛了吗?下面我们来试试Jerry的小技巧,在SAP云平台ABAP编程环境下编写第一个ABAP程序。SAP官方发布的ABAP编程规范ABAPCodeInspector的隐藏功能你知道吗?还在用ABAP进行SAP产品的二次开发?一起来了解一下这个全新的二次开发理念吧。ABAPNetweaver中的寄生编程语言从SAP社区的一篇博客说起,说说SAP产品命名背后的感受。在云平台ABAP编程环境中,CDS视图暴露为OData服务。使用abapGit在ABAPOn-Premises系统和SAP云平台ABAP环境之间传递代码。使用RestfulABAP编程模型开发一个支持增删改查的Fiori应用。你了解RestfulABAP编程模型系列二:Action和Validation的实现Jerry带你了解RestfulABAP编程模型系列三:云ABAP应用调试如何在SAP云平台ABAP编程环境中消费第三方服务ABAP开发者上云时代已经到来——现在大家可以免费使用SAP云平台ABAP环境的试用版了。学而不思则无用——SAP云平台ABAP编程环境的由来及适用场景如何在SAP云平台上搭建Trident应用基于RestfulABAP编程模型,开发部署一个支持增删改查的Fiori应用。SAP2019TechEdKeyNote解读:云时代SAP从业者如何进行二次开发?ABAP云环境中不能使用的ABAP关键字和语法有哪些?ABAP开发环境终于支持驼峰式ABAP变量名自动格式化。使用ABAP740的新关键字REDUCE来完成一个真实的任务。一段让人瑟瑟发抖的ABAP代码。ABAP内核模式下高效复制内表的方法SAP云应用程序模型开发OData实例当ABAP遇上Prometheus用ABAP绘制可缩放矢量图ABAP开发环境语法高亮那些事SAP错误消息调试的七大武器:让所有错误信息定位SAPGUI中使用ABAP操作Excel收藏夹的几种方法小心,你的一举一动都在系统监控中ABAPCCDEF,CCIMP,CCMAC,CCAU,CMXXX这些都是什么鬼东西?ABAP条件断点实现的三种方式使用SATtrace监控从浏览器打开的SAP应用程序的性能以及调用栈13年ABAP老手的忠告:了解这些基础知识有利于ABAP开发无损SAPABAPNetweaver容器化,不可能完成的任务?SAP产品增强技术回顾SAPAPI开发方法大全浅谈Java与SAPABAP静态代理和动态代理,以及ABAP面向切面编程的尝试SAPABAP应用服务器HTTP响应状态码(StatusCode)JavaList存在于SAPABAP中吗采集工具类?CL_OBJECT_COLLECTION了解ABAP面试题系列:写一组会引起死锁(Deadlock)的ABAP程序SAPABAPNetweaver服务器的标准登录方法详解SAPABAP关键字语法图和ABAP代码自动生成工具CodeComposerSAPABAPSM50的替代用法-ABAP工作进程对数据库表读操作的检测SAPABAP字符变量和字符串变量的字符数知识点,SAPABAP血案组关键字ISBOUND,ISNOTINITIALandISASSIGNED的用法SAPABAP和Java中的弱引用(WeakReference)和软引用(SoftReference)分析SAPAMDP简介-ABAP管理的HANA数据库进程标注你的ABAP对象(Tag)历史上的今天:编程语言空引用中的十亿美元错误ABAP开发工具代码模板及其他一些实用技巧SAPABAP开发工具总结提升开发效率的十大技巧如何在SAPBTP平台ABAP编程环境中使用基于SOAP的Web服务ABAP真的过时了吗?聊一聊ABAP的过去、现在和未来基于abapGit和abaplint的ABAP持续集成实例更多Jerry原创文章在这里:《汪子熙》:
