zoukankan      html  css  js  c++  java
  • struts文件上传

      最近项目中使用到文件上传的例子,用到struts中的文件上传及ftp简单总结下:

      1.struts文件上传

      2.ftp服务器搭建

      3.struts上传文件到ftp组件

      1.struts文件

          struts文件上传相对比较简单,由于struts对文件上传进行了封装,上篇文章中说到的struts中的文件上传拦截器进行的处理,具体逻辑代码如下:

     1 public String intercept(ActionInvocation invocation) throws Exception {
     2     ActionContext ac = invocation.getInvocationContext();
     3 
     4     HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);
     5 
     6     if (!(request instanceof MultiPartRequestWrapper)) {
     7         if (LOG.isDebugEnabled()) {
     8             ActionProxy proxy = invocation.getProxy();
     9             LOG.debug(getTextMessage("struts.messages.bypass.request", new String[]{proxy.getNamespace(), proxy.getActionName()}));
    10         }
    11 
    12         return invocation.invoke();
    13     }
    14 
    15     ValidationAware validation = null;
    16 
    17     Object action = invocation.getAction();
    18 
    19     if (action instanceof ValidationAware) {
    20         validation = (ValidationAware) action;
    21     }
    22 
    23     MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) request;
    24 
    25     if (multiWrapper.hasErrors()) {
    26         for (String error : multiWrapper.getErrors()) {
    27             if (validation != null) {
    28                 validation.addActionError(error);
    29             }
    30         }
    31     }
    32 
    33     // bind allowed Files===核心处理代码逻辑
    34     //大体逻辑
    35     //循环遍历前台input标签定义的name列表,每个name对应一个文件列表,遍历文件列表获取文件类型及文件内容
    36     Enumeration fileParameterNames = multiWrapper.getFileParameterNames();
    37     while (fileParameterNames != null && fileParameterNames.hasMoreElements()) {
    38         // get the value of this input tag获取前台定义的name属性
    39         String inputName = (String) fileParameterNames.nextElement();
    40 
    41         // get the content type==获取文件类型
    42         String[] contentType = multiWrapper.getContentTypes(inputName);
    43 
    44         if (isNonEmpty(contentType)) {
    45             // get the name of the file from the input tag==获取文件名
    46             String[] fileName = multiWrapper.getFileNames(inputName);
    47 
    48             if (isNonEmpty(fileName)) {
    49                 // get a File object for the uploaded File
    50                 File[] files = multiWrapper.getFiles(inputName);
    51                 if (files != null && files.length > 0) {
    52                     List<File> acceptedFiles = new ArrayList<File>(files.length);
    53                     List<String> acceptedContentTypes = new ArrayList<String>(files.length);
    54                     List<String> acceptedFileNames = new ArrayList<String>(files.length);
    55                     String contentTypeName = inputName + "ContentType";
    56                     String fileNameName = inputName + "FileName";
    57 
    58                     for (int index = 0; index < files.length; index++) {
    59                         if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation)) {
    60                             acceptedFiles.add(files[index]);
    61                             acceptedContentTypes.add(contentType[index]);
    62                             acceptedFileNames.add(fileName[index]);
    63                         }
    64                     }
    65 
    66                     if (!acceptedFiles.isEmpty()) {
    67                         Map<String, Object> params = ac.getParameters();
    68 //文件列表
    69                         params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()]));
    70 //文件类型名称列表
    71                         params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()]));
    72 //文件名称列表
    73                         params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()]));
    74                     }
    75                 }
    76             } else {
    77                 if (LOG.isWarnEnabled()) {
    78                     LOG.warn(getTextMessage(action, "struts.messages.invalid.file", new String[]{inputName}));
    79                 }
    80             }
    81         } else {
    82             if (LOG.isWarnEnabled()) {
    83                 LOG.warn(getTextMessage(action, "struts.messages.invalid.content.type", new String[]{inputName}));
    84             }
    85         }
    86     }
    87 
    88     // invoke action
    89     return invocation.invoke();
    90 }

      通过研究上面的代码可以明白文件上传的使用方法,比如下面页面:

      前台页面代码如下

     1 <div>
     2     <label>附件上传1</label>
     3     <input name="file" type="file">
     4     <input name="file" type="file">
     5 </div>
     6 <div>
     7     <label>附件上传2</label>
     8     <input name="test" type="file">
     9     <input name="test" type="file">
    10 </div>

      对于这样的前台定义,后台action中应该进行如下想关属性的配置

    //对应前台页面中的name=“file”的一组定义
    private List<File> file;
    private List<String> fileContentType;
    private List<String> fileFileName;
    
    public List<File> getFile() {
        return file;
    }
    
    public void setFile(List<File> file) {
        this.file = file;
    }
    
    public List<String> getFileContentType() {
        return fileContentType;
    }
    
    public void setFileContentType(List<String> fileContentType) {
        this.fileContentType = fileContentType;
    }
    
    public List<String> getFileFileName() {
        return fileFileName;
    }
    
    public void setFileFileName(List<String> fileFileName) {
        this.fileFileName = fileFileName;
    }
     1 //对应前台name为test的属性文件列表
     2 private List<File> test;
     3 private List<String> testContentType;
     4 private List<String> testFileName;
     5 public List<File> getTest() {
     6     return test;
     7 }
     8 
     9 public void setTest(List<File> test) {
    10     this.test = test;
    11 }
    12 
    13 public List<String> getTestContentType() {
    14     return testContentType;
    15 }
    16 
    17 public void setTestContentType(List<String> testContentType) {
    18     this.testContentType = testContentType;
    19 }
    20 
    21 public List<String> getTestFileName() {
    22     return testFileName;
    23 }
    24 
    25 public void setTestFileName(List<String> testFileName) {
    26     this.testFileName = testFileName;
    27 }
  • 相关阅读:
    2016年第七届蓝桥杯C/C++ A组国赛 —— 第一题:随意组合
    寻找段落
    攻击火星
    图论入门
    实数加法
    求 10000 以内 n 的阶乘
    大整数因子
    计算2的N次方
    大整数减法
    大整数加法
  • 原文地址:https://www.cnblogs.com/lixiaojiao-hit/p/4593402.html
Copyright © 2011-2022 走看看