首页 > 学院 > 开发设计 > 正文

struts文件上传

2019-11-15 00:39:32
字体:
来源:转载
供稿:网友
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 File50                 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 action89     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 }


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表