Web Dynpro上传下载

        在项目中经常用到上传下载功能,Web Dynpro提供了两个控件,用于上传下载:FileUpload和FileDownload。

        这两个控件对应的接口是:IWDFileUpload和IWDFileDownload。

        下面说说这两个控件和他们的接口。

 

        FileUpload和FileDownload。在Element Properties中,可以进行data和resource数据绑定,对应于IWDFileUpload中的方法是:    bindData(IWDAttributeInfo attributeInfo)

     bindData(String path)

     bindResource(IWDAttributeInfo attributeInfo)

     bindResource(String path)

  bindData方法在NW2004S中已不推荐使用,推荐使用bindResource。bindData方法绑定的Attribute为binary类型(二进制),而bindResource方法绑定的Attribute为com.sap.ide.webdynpro.uielementdefinitions.Resource类型。
   1·使用bindData方法:

   第一步,设计时绑定控件Attribute,在控件初始化前,声明Attribute的类型

 

  1.     wdContext.getNodeInfo().getAttribute("FileData").getModifiableSimpleType();

   第二步,创建上传事件。

  1.  onActionUploadFile{   
  2.  // get attribute info for context attribute "FileUpload"   
  3.     IWDAttributeInfo attInfo = wdContext.getNodeInfo().getAttribute(IPrivateFileUploadView.IContextElement.FILE_DATA);
  4.     // get modifiable binary type from the attribute info   
  5.     // requires type cast 
  6.     IWDModifiableBinaryType binaryType = (IWDModifiableBinaryType) attInfo.getModifiableSimpleType();
  7.     IPrivateFileUploadView.IContextElement element = wdContext.currentContextElement();
  8.     //if a file in the FileUpload field exists
  9.     if (element.getFileData() != null) {
  10.       try {
  11.         //获取文件类型
  12.         String mimeType = binaryType.getMimeType().toString();
  13.         //获取文件数据
  14.         byte[] file = element.getFileData();
  15.         //获取文件大小 
  16.         String fileSize = this.getFileSize(file));
  17.         //获取文件扩展名
  18.         String fileExtension = binaryType.getMimeType().getFileExtension();
  19.         //文件名
  20.         String fileName = binaryType.getFileName();
  21.       } catch (Exception e) {
  22.              throw new WDRuntimeException(e);
  23.       }
  24.     }
  25.   private String getFileSize(byte[] file) {
  26.     double size = file.length;
  27.     String unit = "";
  28.     if (size < 1024) {
  29.       unit = " Bytes";
  30.     } else if (size < 1048576) {
  31.       size = size / 1024;
  32.       unit = " KB";
  33.     } else if (size < 1073741824) {
  34.       size = size / 1024 / 1024;
  35.       unit = " MB";
  36.     }
  37.     DecimalFormat myFormatter = new DecimalFormat("###.##");
  38.     return myFormatter.format(size) + unit;
  39.   }
  40. }

    2·使用bindResource方法。

  1. onActionUploadFile{    
  2.     IPrivateFileUploadView.IContextElement element = wdContext.currentContextElement();
  3.     // if a file in the FileUpload field exists
  4.     if (element.getFileResource() != null) {
  5.       //获取文件数据
  6.       IWDResource resource = element.getFileResource();
  7.       InputStream inst = resource.read(true);
  8.       //获取文件类型
  9.       String fileType = resource.getResourceType();
  10.       //获取文件大小 
  11.       String fileSize = this.getFileSize(resource);
  12.       //获取文件扩展名
  13.       String fileExtension = resource.getResourceType().getFileExtension();
  14.       //获取文件名
  15.       String fileName = resource.getResourceName();
  16.       //获取文件相对路径
  17.       String filePath = resource.getUrl(0);
  18.     }
  19. }
  20.   private String getFileSize(IWDResource resource) {
  21.     InputStream stream = null;
  22.     DecimalFormat myFormatter = new DecimalFormat("###.##");
  23.     double size = 0;
  24.     String unit = "";
  25.     try {
  26.       stream = resource.read(false);
  27.       size = stream.available();
  28.       if (size < 1024) {
  29.         unit = " Bytes";
  30.       } else if (size < 1048576) {
  31.         size = size / 1024;
  32.         unit = " KB";
  33.       } else if (size < 1073741824) {
  34.         size = size / 1024 / 1024;
  35.         unit = " MB";
  36.       }
  37.     } catch (IOException e) {
  38.       throw new IOException(e);
  39.     } finally {
  40.       if (stream != null) {
  41.         try {
  42.           stream.close();
  43.         } catch (IOException e) {
  44.             throw new IOException(e);
  45.         }
  46.       }
  47.     }
  48.     return myFormatter.format(size) + unit;
  49.   }

     注意:

     1·使用IWDResource 做文件上传时候,这个文件的生命周期是在当前的session内,当当前的session被销毁或者关闭时,上传的文件同时也被清除,他的getUrl方法所获取的地址已经不存在。其实IWDResource 上传的文件是放在WAS的公共目录下(app-当前应用pool)。

     个人感觉这是WD2004S的一个BUG,看在07的版本中是否会做修改。

     2·文件名的问题:

        不管是用bindData还是用bindResource,在以上的方法中获取的文件名只局限于文件名是英文,如果文件名是中文,则bindResource方法是无法上传。而bindData提供了一个比较隐形的获取文件名的地方,就是在控件绑定数据Attribute的同时把Element Properties中的fileName也绑定一个FileNameAttribute,这个FileNameAttribute不需要手动设值,而是在触发上传事件的时候,框架自动设定上,不管是英文中文或者别的语言都没有问题。于是,可以轻而易举得到你想要的文件名。

     

     了解了上传,相信下载也很简单了。

你可能感兴趣的:(SAP,WebDynpro,For,Java)