如何将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'
EXPORTING
input = lv_id
IMPORTING
output = 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 block
e.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程序保存到本地的更多相关文章
- 在mac系统上安装Eclipse,编写java程序
第一步:安装java jre(java 运行环境). 如图所示: 登陆Oralce官网,点击Download选项,找到如图所示界面: 选择Java Runtime Environment(JRE),打 ...
- 数据库blob图片文件,多图片打包下载
数据库存储blob图片文件,前端打包下载 数据库图片文件实体类 package com.cmrh.mspserver.pos.dto; import java.io.Serializable; imp ...
- .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...
- MongoDb gridfs-ngnix文件存储方案 - 图片
http://www.cnblogs.com/wintersun/p/4622205.html 在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储. ...
- Android--从系统Gallery获取图片
前言 在Android应用中,经常有场景会需要使用到设备上存储的图片,而直接从路径中获取无疑是非常不便利的.所以一般推荐调用系统的Gallery应用,选择图片,然后使用它.本篇博客将讲解如何在Andr ...
- 架构设计:系统存储(24)——数据一致性与Paxos算法(中)
(接上文<架构设计:系统存储(23)--数据一致性与Paxos算法(上)>) 2-1-1. Prapare准备阶段 首先须要介绍几个在Acceptor角色上须要被持久化保存的数据属性: P ...
- [Android] 针对生成的图片文件在系统Gallery不显示的处理
之前遇到过一个问题,就是发现我在程序中生成一个新的 Bitmap 之后,当我打开系统的 Gallery 查看时,并没有看到新生成的图像.然而打开文件浏览器,找到保存 Bitmap 所在的文件夹下,还能 ...
- 架构设计:系统存储(28)——分布式文件系统Ceph(挂载)
(接上文<架构设计:系统存储(27)--分布式文件系统Ceph(安装)>) 3. 连接到Ceph系统 3-1. 连接客户端 完毕Ceph文件系统的创建过程后.就能够让客户端连接过去. Ce ...
- 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端
导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐
随机推荐
- 使用MeshLab的技巧总结(自己原创总结)
1.放大点的显示,Alt+wheel,即按住Alt键后使用鼠标滑轮改变点的显示大小.
- ACM-ICPC2018北京网络赛 Tomb Raider(暴力)
题目2 : Tomb Raider 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, the fiercely independent daughte ...
- JS判断上传文件类型
/* * 判断图片类型 */ function checkImgType(ths){ if (ths.value == "") { ...
- .net 扩展方法,lamada表达式 委托
扩展方法 (1)扩展方法是一种特殊的静态方法,它定义在一个静态类中,但可以在其他类的对象上向调用实例方法那样进行调用.因此,通过扩展方法,我们就可以在不修改一个类型的前提下对一个类型进行功能上的扩充, ...
- Netdata 是一款 Linux 性能实时监测工具
具体的netdata介绍请参照GIT:https://github.com/firehol/netdata/wiki 以下只介绍centos下的netdata的安装与使用: 1.安装Netdata需要 ...
- Docker环境下的前后端分离项目部署与运维(七)Redis高速缓存
Redis高速缓存 利用内存保存数据,读写速度远超硬盘:可以减少I/O操作,降低I/O压力. 发红包.抢红包的数据可以存在高速缓存中,加快处理速度,不需要经过数据库 淘宝首页一些优惠活动商品等热数据可 ...
- css样式也技巧
目录 关于iPhone的点击事件绑定无效的处理方法 https://blog.csdn.net/u014477038/article/details/52527194 去掉a.button.input ...
- android studio 改包名
使用Android studio有一段时间了,但是每次修改包名的时候都是用一种简单粗暴的方式,那就是新建一个想要的包名,然后直接拖拽. 但是这样有个不好的地方就是每次都要去修改manifest.xml ...
- HDU 6003 Problem Buyer【小根堆】
任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就 ...
- 进击JavaScript核心 --- (1)基本数据类型
ES5之前提供了 5种基本数据类型 和 1种引用数据类型 基本数据类型:Undefined, Null, String, Number, Boolean 引用数据类型:Object ES6开始引入了一 ...