如何将S/4HANA系统存储的图片文件用Java程序保存到本地
我在S/4HANA的事务码MM02里为Material维护图片文件作为附件:
通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来:
REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.
DATA lo_gos_api TYPE REF TO cl_gos_api.
DATA lt_attachment_list TYPE gos_t_atta.
DATA lt_role_filter TYPE gos_t_rol.DATA: lv_id TYPE matnr VALUE '16',lt_att TYPE TABLE OF sibflporb.CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGinput = lv_idIMPORTINGoutput = lv_id.
ls_appl_object-typeid = 'BUS1001006'.
ls_appl_object-instid = lv_id.
ls_appl_object-catid = 'BO'.START-OF-SELECTION.TRY.lo_gos_api = cl_gos_api=>create_instance( ls_appl_object ).APPEND cl_gos_api=>c_attachment TO lt_role_filter.lt_attachment_list = lo_gos_api->get_atta_list( lt_role_filter ).CATCH cx_gos_api INTO DATA(error).WRITE:/ error->get_text( ).RETURN.ENDTRY.DATA: ls_key TYPE gos_s_attkey,lv_base64 type string.LOOP AT lt_attachment_list ASSIGNING FIELD-SYMBOL(<id>).ls_key-atta_id = <id>-atta_id.ls_key-atta_cat = <id>-atta_cat.DATA(ls) = lo_gos_api->get_al_item( ls_key ).BREAK-POINT.ENDLOOP.
然后我把这段代码封装到一个Function moduleZDIS_GET_MATERIAL_IMAGES里,在Java代码里消费这个function module,把S/4HANA返回的二进制内容存成本地图片文件。在ABAP系统里图片二进制文件内容的类型为RAWSTRING,如何在Java里使用它?
使用JCO在Java里消费ABAP function module的代码:
static private void getProductImageTest(){JCoDestination destination = null;try {destination = JCoDestinationManager.getDestination(DESTINATION_NAME);JCoRepository repo = destination.getRepository();JCoFunction stfcConnection = repo.getFunction("ZDIS_GET_MATERIAL_IMAGES");JCoParameterList imports = stfcConnection.getImportParameterList();String materialID = "16";imports.setValue("IV_MATERIAL_ID", materialID);stfcConnection.execute(destination);JCoParameterList exports = stfcConnection.getExportParameterList();int abapDuration = exports.getInt("EV_DURATION");StringBuilder sb = new StringBuilder();sb.append("{ \"" + ABAP_DURATION + "\": " + abapDuration + ",");sb.append("\"" + UPSELL_PRODUCT + "\":[");JCoTable codes = exports.getTable("ET_IMAGES");int row = codes.getNumRows();System.out.println("Total rows: " + row);System.out.println("ABAP duration: " + abapDuration);for( int i = 0; i < row; i++){codes.setRow(i);sb.append("{\"" + FILE_ID + "\":" + codes.getString("FILEID") + ","+ "\"" + FILE_OWNER + "\":\"" + codes.getString("OWNER") + "\"" + ",");sb.append("{\"" + FILE_CDATE + "\":" + codes.getString("CREATION_DATE") + ","+ "\"" + FILE_NAME + "\":\"" + codes.getString("FILENAME") + "\""); storeLocalFile(codes);if( i < row - 1){sb.append("},");}else{sb.append("}");}}sb.append("]}");System.out.println("Final json: " + sb.toString());} catch (JCoException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
其中把ABAP的类型为RAWSTRING的字段保存成本地文件的代码封装于方法storeLocalFile里:
static private void storeLocalFile(JCoTable codes){InputStream is = codes.getBinaryStream("FILECONTENT");try {File file = new File("c:\\temp\\" + codes.getString("FILENAME"));byte[] bytes = new byte[is.available()];is.read(bytes);OutputStream output = new FileOutputStream(file);BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);bufferedOutput.write(bytes);bufferedOutput.close();is.close();} catch (IOException e) {e.printStackTrace();}}
执行Java代码后,在本地C盘temp目录下能够看到S/4HANA里Material ID为16的两个附件图片:
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
如何将S/4HANA系统存储的图片文件用Java程序保存到本地相关推荐
- java提供图片链接,提取网页的图片链接的Java程序
提取网页的图片链接的Java程序 输入网页文件名,和资源列表文件名 输出资源列表文件供迅雷下载. 适用于批量下载图片. 由两个文件组成. 没有提供网页下载功能,因为我没有时间写,相关的代码以后再贴. ...
- 爬虫实战5:爬取全部穿越火线武器的图片以武器名称命名保存到本地文件
申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 穿越火线官网 完整代码 运行结果 穿越火线官网 完整代码 import requests# 循环33次,官网武器库展示有33页 ...
- Windows系统 Prefetch目录 *.pf 文件解析 -- 探索程序运行记录、保护隐私
一.前言 1.本文说明 如果喜欢打开XX软件看XX视频等,看了多少次,什么时候看的,都会被记录下来,用软件来查看一下,全部的隐私都没有了. 家里的小孩玩的啥游戏,玩了多少次,也都可以看得一清二楚. 查 ...
- java 将图片转成二进制文件bin_java 问题:怎样把一个bin二进制图片文件用java代码打开?求解!...
展开全部 Java中可以用java.awt.Toolkit类打开gif,jpg,png三种类型的二进制图片文件,如果是62616964757a686964616fe59b9ee7ad943133333 ...
- 如何在mac上编写java程序_在mac系统上安装Eclipse,编写java程序
第一步:安装java jre(java 运行环境). 如图所示: 登陆Oralce官网,点击Download选项,找到如图所示界面: 选择Java Runtime Environment(JRE),打 ...
- mysql blob 读取 图片_mysql中以blob形式存储的图片文件 通过ajax方式传输 在js中设置成img控件的src...
第一步,读取blob数据, 第二步,将blob数据转换成byte数组 第三步,将byte数据进行base64加密转换成字符串并回传 第四步,接收字符串 第五步,将img控件的src设置成"d ...
- 使用html2Canvas将页面转化为canvas图片,最后长按保存到本地,史上最全 html2canvas 使用 踏坑之旅,没有之一
最近工作中遇到一个需求,类似这样 点击商品二维码,生成一张带有商品图片.标题.描述.二维码等信息的图片,用户长按进行保存. 在使用html2canvas进行项目开发的时候,遇到很多的问题,主要为一下方 ...
- 将图片文件以二进制方式保存和恢复
/** * 将图片转换成二进制 * * @return */ static String getImageBinary() { BASE64Encoder encoder = new sun.misc ...
- java提供图片链接,提取网页图片链接的JAVA程序
输入网页文件名,和资源列表文件名 输出资源列表文件供迅雷下载. 适用于批量下载图片. 由两个文件组成. 1// AnalizeIMG.java 2 3 // 主程序 4 5 import java.i ...
最新文章
- code forces 436 C. Bus
- 新手tiktok怎么做?海外tiktok怎么赚钱!
- 什么是单反相机?什么叫数码相机?
- 虚拟机系统克隆到服务器上,迁移虚拟机
- IE8无法取得客户端完整路径的解决办法
- js简单实现切换图片上一张下一张功能
- 破解WMV格式电影的许可证
- 文献管理工具EndNote X8 破解版,Windows版
- 【短链接】——自己实现一个短网址服务
- 【Linux命令】mergecap命令的用法
- 使用BeautifulSoup,解释器报错‘lxml‘
- inflate方法的用法
- js eval Uncaught SyntaxError: unexpected token: ‘:‘
- 计算机连接网络被限制,电脑连接wifi出现网络受限的解决方法
- BeautyGAN图片的高精度美颜
- GameOff2022参与有感
- Microsoft 解决方案框架版本 3.0 概述
- mysql登录框万能密码_Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]...
- 大话Ceph--RBD那点事儿
- java蘑菇岛种子_比蘑菇岛更稀有的“蘑菇陆地”见过么?输入MC种子即可找到
热门文章
- android平台使用java动态生成公私钥,并导出证书文件
- HIVE入门之数据模型
- 保研计算机辅助翻译,本科2013级推免生寄语
- 通过 SAP UI5 的 TypeScript 开发环境,来学习什么是 DefinitelyTyped
- 什么是 JavaScript 世界的 UMD
- Angular Component 实现类,先执行字段初始化,再调用构造函数
- 为什么 OAuth 里除了 Access Token 之外,还需要 Refresh Token?
- SAP ABAP 编程语言里允许哪些特殊字符作为变量名的一部分?
- SAP Spartacus B2B 列表页面的 (i) icon popover Component 的声明位置
- fixture.detectChange如何通过Angular zone执行其异步逻辑的