ABAP 屏幕图片上传与展示 以及自定义图片的上传和保存

图片处理类  CL_GUI_PICTURE

主要方法   LOAD_PICTURE_FROM_URL(加载图片)

                 SET_3D_BORDER  "设置图片框

                 SET_DISPLAY_MODE "自适应容器大小(CL_GUI_PICTURE=>ADUST_DESIGN_TURE),

FUNCTION    *创建图片URL地址  'DP_CREATE_URL'

                       *读取WWWDATA表,取得图片对象信息   'WWW_GET_MIME_OBJECT'


1.Tcode: SMW0 保证 有图片MIME类型(设置)

2.绘制屏幕 container容器( TYPE REF TO CL_GUI_CUSTOM_CONTAINER. )

3.使用类 CL_GUI_PICTURE 调用方法 LOAD_PICTURE_FROM_URL

*定义控制和图像对象定义
DATA CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA PICTURE TYPE REF TO CL_GUI_PICTURE.
*初始标志字段定义
DATA INIT.


*如果还未创建定制对象
  IF INIT IS INITIAL.
*图片地址字段定义
    DATA URL(255).
    CLEAR URL.
*创建对象
    CREATE OBJECT CONTAINER
      EXPORTING CONTAINER_NAME = 'P1'.

    CREATE OBJECT PICTURE
      EXPORTING PARENT = CONTAINER
      EXCEPTIONS ERROR = 1.
    IF SY-SUBRC NE 0.
    ENDIF.
*定义通用函数取得图片地址
    PERFORM LOAD_PIC_DB CHANGING URL.
*显示图片
    CALL METHOD PICTURE->LOAD_PICTURE_FROM_URL
      EXPORTING
        URL = URL.
    IF SY-SUBRC NE 0.
    ENDIF.
*置标志位已初始
    INIT = 'X'.
  ENDIF.
ENDMODULE.


*获取图片地址通用函数
FORM LOAD_PIC_DB CHANGING P_URL.
  DATA QUERY_TABLE LIKE W3QUERY OCCURS 1 WITH HEADER LINE.
  DATA HTML_TABLE LIKE W3HTML OCCURS 1.
  DATA RETURN_CODE LIKE W3PARAM-RET_CODE.
  DATA CONTENT_TYPE LIKE W3PARAM-CONT_TYPE.
  DATA CONTENT_LENGTH LIKE W3PARAM-CONT_LEN.
  DATA PIC_DATA LIKE W3MIME OCCURS 0.
  DATA PIC_SIZE TYPE I.

  REFRESH QUERY_TABLE.
*查询对象数据
  QUERY_TABLE-NAME = '_OBJECT_ID'.
*图片对象名称
  QUERY_TABLE-VALUE = 'ZGXPNG2'. " SMW0图片命名名称
  APPEND QUERY_TABLE.
*读取WWWDATA表,取得图片对象信息
  CALL FUNCTION 'WWW_GET_MIME_OBJECT'
    TABLES
      QUERY_STRING = QUERY_TABLE
      HTML = HTML_TABLE
      MIME = PIC_DATA
    CHANGING
      RETURN_CODE = RETURN_CODE
      CONTENT_TYPE = CONTENT_TYPE
      CONTENT_LENGTH = CONTENT_LENGTH
    EXCEPTIONS
      OBJECT_NOT_FOUND = 1
      PARAMETER_NOT_FOUND = 2
      OTHERS = 3.
  IF SY-SUBRC EQ 0.
    PIC_SIZE = CONTENT_LENGTH.
  ENDIF.
*创建图片URL地址
  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      TYPE = 'image'
      SUBTYPE = CNDP_SAP_TAB_UNKNOWN
      SIZE = PIC_SIZE
      LIFETIME = CNDP_LIFETIME_TRANSACTION
      TABLES
        DATA = PIC_DATA
      CHANGING
        URL = P_URL
  EXCEPTIONS
    DP_INVALID_PARAMETER = 1
    DP_ERROR_PUT_TABLE = 2
    DP_ERROR_GENERAL = 3
    OTHERS = 4.
ENDFORM.

表  WWWDATA 


4.对图片做出处理,更改图片大小等

CALL METHOD PICTURE->SET_DISPLAY_MODE "自适应容器大小,
   EXPORTING
     DISPLAY_MODE = CL_GUI_PICTURE=>ADUST_DESIGN_TRUE "x
   EXCEPTIONS
     ERROR        = 1 
     OTHERS       = 2 .

CALL METHOD PICTURE->SET_3D_BORDER "设置图片框
   EXPORTING
     BORDER       = 1
   EXCEPTIONS
     ERROR        = 1 
     OTHERS       = 2 .

任意图片都可以达到效果 

二、除了使用SMW0上传图片至服务器外,也可以自定义数据库来存储自定义图片,达到更随意的上传和保存 

2.1 数据库设计

 程序结构

INCLUDE ZTEST_PICLOADTOP.
INCLUDE ZTEST_PICLOADSCR.
INCLUDE ZTEST_PICLOADO01.
INCLUDE ZTEST_PICLOADI01.
INCLUDE ZTEST_PICLOADF01.

START-OF-SELECTION .
  PERFORM UPLOAD_PICTURE .
  PERFORM SHOW_PICTURE .

END-OF-SELECTION.

   CALL SCREEN 0100 .

 2.2数据声明部分

TYPES: BEGIN OF TY_PIC,
           PIC_DATA(1024) TYPE X, "
         END OF TY_PIC.
DATA: PIC_TAB TYPE TABLE OF TY_PIC.
DATA: GS_PIC TYPE ZPIC_SAVE .  "参照数据库定义结构
DATA: GC_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER , "图片显示容器
      GO_PIC TYPE REF TO CL_GUI_PICTURE." 图片加载对象
DATA:   GV_FILELENGTH TYPE I,
        URL(256),
        RESU TYPE I VALUE 123,
        GV_FILENAME TYPE STRING.
DATA OK_CODE TYPE SY-UCOMM .

CONSTANTS:
     GC_CON TYPE C LENGTH 3  VALUE 'PIC' .

 2.3 选择屏幕部分

SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS : P_ID TYPE CHAR10 OBLIGATORY.
PARAMETERS : P_FILE TYPE IBIPPARMS-PATH OBLIGATORY .

SELECTION-SCREEN END OF BLOCK B1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.

    PERFORM SELECT_FILE USING P_FILE.

2.4 PBO部分

MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
* SET TITLEBAR 'PIC UPLOAD'.
  IF GC_CONTAINER IS INITIAL." 对图片对象初始化
    CREATE OBJECT GC_CONTAINER 
       EXPORTING
            CONTAINER_NAME = GC_CON.
    CREATE OBJECT GO_PIC
       EXPORTING
            PARENT = GC_CONTAINER.
  ENDIF.

  CALL METHOD GO_PIC->LOAD_PICTURE_FROM_URL " 加载图片
    EXPORTING
      URL    = URL
    IMPORTING
      RESULT = RESU.
ENDMODULE.

2.5 FORM部分 ,两级反转,创建URL

FORM SELECT_FILE  USING P_FILE. "F4 filename ,上传
    CALL FUNCTION 'F4_FILENAME'
      IMPORTING
        FILE_NAME = P_FILE.

ENDFORM.
FORM UPLOAD_PICTURE .
  GV_FILENAME = P_FILE.
  DATA LV_BUFFER TYPE XSTRING.
  CALL FUNCTION 'GUI_UPLOAD'  "上传图片,计算文件长度
    EXPORTING
      FILENAME                      = GV_FILENAME
      FILETYPE                      = 'BIN'
*     HAS_FIELD_SEPARATOR           = ' '
*     HEADER_LENGTH                 = 0
*     READ_BY_LINE                  = 'X'
*     DAT_MODE                      = ' '
*     CODEPAGE                      = ' '
*     IGNORE_CERR                   = ABAP_TRUE
*     REPLACEMENT                   = '#'
*     CHECK_BOM                     = ' '
*     VIRUS_SCAN_PROFILE            =
*     NO_AUTH_CHECK                 = ' '
    IMPORTING
      FILELENGTH                    = GV_FILELENGTH
*     HEADER                        =
    TABLES
      DATA_TAB                      = PIC_TAB[]
*   CHANGING
*     ISSCANPERFORMED               = ' '
   EXCEPTIONS
   EXCEPTIONS
     FILE_OPEN_ERROR               = 1
     FILE_READ_ERROR               = 2
     NO_BATCH                      = 3
     GUI_REFUSE_FILETRANSFER       = 4
     INVALID_TYPE                  = 5
     NO_AUTHORITY                  = 6
     UNKNOWN_ERROR                 = 7
     BAD_DATA_FORMAT               = 8
     HEADER_NOT_ALLOWED            = 9
     SEPARATOR_NOT_ALLOWED         = 10
     HEADER_TOO_LONG               = 11
     UNKNOWN_DP_ERROR              = 12
     ACCESS_DENIED                 = 13
     DP_OUT_OF_MEMORY              = 14
     DISK_FULL                     = 15
     DP_TIMEOUT                    = 16
     OTHERS                        = 17
            .
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      INPUT_LENGTH = GV_FILELENGTH
    IMPORTING
      BUFFER       = LV_BUFFER
    TABLES
      BINARY_TAB   = PIC_TAB[]
    EXCEPTIONS
      FAILED       = 1
      OTHERS       = 2.

  GS_PIC-ID = P_ID.
  GS_PIC-XTRING = LV_BUFFER.
  MODIFY ZPIC_SAVE FROM GS_PIC.
  IF SY-SUBRC = 0.
    MESSAGE '图片已保存到数据库' TYPE 'S'.
  ELSE.
    MESSAGE '图片保存失败!' TYPE 'E'.
  ENDIF.

ENDFORM.
FORM SHOW_PICTURE .
  CLEAR PIC_TAB.
  SELECT SINGLE * FROM ZPIC_SAVE INTO GS_PIC WHERE ID = P_ID.
  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      BUFFER     = GS_PIC-XTRING
    TABLES
      BINARY_TAB = PIC_TAB.

  CALL FUNCTION 'DP_CREATE_URL'
    EXPORTING
      TYPE    = 'IMAGE'
      SUBTYPE = 'PNG'
    TABLES
      DATA    = PIC_TAB
    CHANGING
      URL     = URL.

ENDFORM.

实现效果 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gong JX

多谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值