如何将S/4HANA系统存储的图片文件用Java程序保存到本地

简介: 我在S/4HANA的事务码MM02里为Material维护图片文件作为附件:

image.png

通过如下简单的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里使用它?

image.png

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();
    }
     }

image.png

相关文章
|
1天前
|
Java
Java程序的流程控制
程序执行顺序经典三类: 1. **顺序结构**: 代码从上至下依次执行。 2. **分支结构**: - `if/else`: 根据条件选择执行路径。 - `switch`: 通过匹配值选择分支,需注意`break`避免穿透现象。 3. **循环结构**: 控制代码重复执行,如`for`, `while`, `do...while`等。 (注:markdown格式不支持内嵌卡片或图片,故摘要中未包含原文中的图片信息。)
51 7
|
9天前
|
JavaScript Java
Java 将Markdown文件转换为Word和PDF文档
【7月更文挑战第5天】Java中使用`Spire.Doc for Java`库可方便地将Markdown转换为Word或PDF。基本步骤包括导入模块,创建`Document`对象,加载Markdown文件,然后保存为目标格式(`.docx`或`.pdf`)。若遇到`Invalid UTF-8 stream`错误,需确保Markdown文件是UTF-8无BOM编码。页面设置可通过`PageSetup`类调整。注意,实际应用会依据具体需求和环境有所调整。
|
9天前
|
关系型数据库 MySQL Java
|
16天前
|
存储 Java 程序员
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
Java面试题:方法区在JVM中存储什么内容?它与堆内存有何不同?
39 10
|
23天前
|
Java API 开发者
Java中的文件I/O操作详解
Java中的文件I/O操作详解
|
16天前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
25 0
|
21天前
|
Java 调度 Windows
Java面试之程序、进程、线程、管程和并发、并行的概念
Java面试之程序、进程、线程、管程和并发、并行的概念
17 0
|
22天前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
22天前
|
Java
Java之file,创建文件,File f1 = new File(“E:\\itcast\\java.txt“),先f1定路径,在f1.createNewFile()就能够创建文件,mkdir目录
Java之file,创建文件,File f1 = new File(“E:\\itcast\\java.txt“),先f1定路径,在f1.createNewFile()就能够创建文件,mkdir目录
|
23天前
|
存储 缓存 NoSQL
使用Java编写高效的文件处理和存储系统
使用Java编写高效的文件处理和存储系统