首页 > 其他分享 >【ABAP】-上传文件压缩后下载

【ABAP】-上传文件压缩后下载

时间:2024-07-24 18:32:06浏览次数:17  
标签:上传 压缩 lv ABAP file TYPE save DATA gui

主要用到了xsting和binary之间的转换以及gui的操作

代码如下

*&---------------------------------------------------------------------*
*& Report zpr_zip_file
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zpr_zip_file.

START-OF-SELECTION.

  "选择文件
  DATA lv_file_table  TYPE filetable.
  DATA lv_rc  TYPE i.
  DATA lv_user_action  TYPE i.
  DATA lv_file_encoding  TYPE abap_encoding.

  cl_gui_frontend_services=>file_open_dialog( EXPORTING  window_title      = '选择一个Excel文件'
                                                         default_extension = 'xlsx'
                                                         file_filter       = cl_gui_frontend_services=>filetype_all
                                                         multiselection    = abap_false
                                              CHANGING   file_encoding     = lv_file_encoding
                                                         file_table        = lv_file_table
                                                         rc                = lv_rc
                                                         user_action       = lv_user_action
                                              EXCEPTIONS OTHERS            = 1 ).

  IF lv_rc = 1.
    DATA(lv_file) = lv_file_table[ 1 ].
  ENDIF.
  DATA lv_file_path TYPE string.
  DATA lv_file_name TYPE string.
  "拆分文件
  cl_bcs_utilities=>split_path(
    EXPORTING
      iv_path = lv_file
    IMPORTING
      ev_path = lv_file_path
      ev_name = lv_file_name ).
  "上传文件
  IF lv_file IS NOT INITIAL.
    DATA lv_fileLength TYPE i.
    DATA lv_fileheader TYPE xstring.
    DATA lv_file_data TYPE STANDARD TABLE OF solix.
    cl_gui_frontend_services=>gui_upload( EXPORTING filetype   = 'BIN'
                                                    filename   = CONV string( lv_file )
                                          IMPORTING filelength = lv_fileLength
                                                    header     = lv_fileheader
                                          CHANGING  data_tab   = lv_file_data ).
  ENDIF.

  DATA lv_file_xstring TYPE xstring.
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_fileLength
    IMPORTING
      buffer       = lv_file_xstring
    TABLES
      binary_tab   = lv_file_data
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

  "压缩文件
  DATA(lo_zip) = NEW cl_abap_zip( ).
  lo_zip->support_unicode_names = abap_true."防止中文乱码
  lo_zip->add( name = lv_file_name content = lv_file_xstring ).
  DATA(lo_zip_file) = lo_zip->save( ).

  DATA: lv_len TYPE i.
  DATA lt_bin TYPE solix_tab.

  CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
    EXPORTING
      buffer        = lo_zip_file
    IMPORTING
      output_length = lv_len
    TABLES
      binary_tab    = lt_bin.

  DATA lv_save_filename TYPE string.
  DATA lv_save_filepath TYPE string.
  DATA lv_save_filefullPath TYPE string.
  DATA lv_save_action TYPE i.
  "打开保存窗口
  cl_gui_frontend_services=>file_save_dialog( EXPORTING  window_title              = '保存文件'
                                                         default_extension         = 'zip'
                                                         default_file_name         = 'test.zip'
                                                         file_filter               = cl_gui_frontend_services=>filetype_all
                                                         prompt_on_overwrite       = abap_true
                                              CHANGING   filename                  = lv_save_filename
                                                         path                      = lv_save_filepath
                                                         fullpath                  = lv_save_filefullPath
                                                         user_action               = lv_save_action
                                              EXCEPTIONS cntl_error                = 1                " Control error
                                                         error_no_gui              = 2                " No GUI available
                                                         not_supported_by_gui      = 3                " GUI does not support this
                                                         invalid_default_file_name = 4                " Invalid default file name
                                                         OTHERS                    = 5 ).
  IF lv_save_action = cl_gui_frontend_services=>action_ok.
    "下载
    cl_gui_frontend_services=>gui_download( EXPORTING filetype   = 'BIN'
                                                      filename   = lv_save_filefullPath
                                            IMPORTING filelength = lv_fileLength
                                            CHANGING  data_tab   = lt_bin ).
  ENDIF.

 

问题点:

如果文件是中文文件名,则可能遇到乱码的问题,原因是cl_abap_zip类的add方法中对文件名进行了编码

 这里可以看到support_unicode_names默认是false,则进行的是CP437的编码,针对中文进行437编码时无法编码的字符责备替换为了#,所以我们在调用add方法时,需要将support_unicode_names设置为true,避免中文变为#号

标签:上传,压缩,lv,ABAP,file,TYPE,save,DATA,gui
From: https://www.cnblogs.com/Lingcc/p/18321448

相关文章

  • gitee上传项目
    1、首先保证电脑内有git这里最好按照正确的教程全装和配置;2、在gitee上新建仓库;建好仓库后,应该是这个样子,为空。若是含有readme文件,在后续上传项目时可以用覆盖的方式。3、上传项目找到要上传的项目,用gitbash打开;gitinit在这里若是git按照正确的方式安装和配置,在......
  • 从excel列表读取图片,上传并匹配--基于03版
    主要思路:1.读取所有图片,先传到服务器本地,用row行编号命名图片名称.2.传到图片服务器,获取图片url3.与excel其它数据行匹配---------------不知为啥首尾两行不进去的分割线------------------------------publicvoidimportExcel(MultipartFilefiles)throwsException......
  • 解决wordpress媒体上传一张图片裁剪成多张的问题
    问题在使用wordpress的媒体库的过程中我发现,我上传一张图片,但是在服务器的文件中会自动裁剪处多张不同尺寸的图片,这样在不需要的情况下,会造成存储压力解决1.wordpress后台设置打开wordpress的后台设置→媒体把这里的勾选去掉然后保存更改2.代码内修改代码文件路径/wp-con......
  • php使用ZipArchive解压压缩包
    //处理照片压缩包$zip=new\ZipArchive();//获取压缩包内容照片数量$path='static/oa/img/staImport/'.date('Ymd').'/'.date('His');if($zip->open($param['fileUrl'])===TRU......
  • 易优CMS模板标签uibackground背景图片在模板文件index.htm中调用uibackground标签,实现
    【基础用法】标签:uibackground描述:背景图片上传标签,使用时结合html一起才能完成可视化布局,只针对具有可视化功能的模板。用法:<divclass="eyou-edit"e-id="文件模板里唯一的数字ID"e-page='文件模板名'e-type="background"style="background-image:url({eyou:uibackgrounde......
  • 面试常考--前端性能优化之大文件上传
    大文件上传是前端开发中常见的需求之一,特别是在需要处理高清图片、视频或其他大型文件时。优化大文件上传不仅可以提升用户体验,还能有效减轻服务器负担。本文将深入探讨大文件上传的几种常见优化技术,包括文件切片与并发上传、断点续传、后台处理优化、安全性考虑和用户体验优化。......
  • Qt实现图片拖拽上传过滤文件夹内图片自动搜索列表展示
     1.功能实现支持图片、或者文件夹拖拽上传,会自动获取文件夹中的图片。对拖入的文件做格式判断,不符合格式要求的会不支持拖入,拖入后展示在list列表中,可以进行删除,和上下滚动查看;#ifndefDRAGDROPPIC_H#defineDRAGDROPPIC_H#include<QWidget>#include"ui_DragDropPic.h......
  • 纹理压缩格式
    参考:移动平台打包纹理压缩设置-JeasonBoy-博客园(cnblogs.com)Unity官方的文档对于纹理压缩的说明:Recommended,default,andsupportedtextureformats,byplatform-Unity手册Unity支持许多常见的图像格式作为导入纹理的源文件(例如JPG、PNG、PSD和TGA)。但是,3D......
  • 既然内存不值钱,为什么java还要搞一个压缩指针?
    尽管当前内存的价格可能相对较为亲民,但Java引入压缩指针技术的原因并不单纯基于内存成本,而是出于优化内存使用、提升程序性能以及适应不同应用场景的综合考虑。在64位Java虚拟机(JVM)中,传统的指针占用8个字节(64位)。然而,对于大多数Java应用程序来说,实际上并不需要如此大的内存地......
  • 如何在 Python 中查看与 Azure OpenAI 助手关联的所有上传文件?
    我正在使用Python对文档中的问题进行基准测试,并在jupyter笔记本中实例化了我的助手。我想确认助手是否有我上传的文件,但似乎找不到有关此功能将使用什么功能的文档。使用适用于AzureOpenAI的最新版本的PythonAPI。目前,无法使用AzureOpenAI的PythonAPI直接查看......