你的位置:首页 > Java教程

[Java教程]Struts2学习笔记(十一)——文件上传


1、单文件上传

单文件上传步骤:

 1)创建上传jsp页面

文件上传的表单提交方式必须是POST方式,编码类型:enctype="multipart/form-data",默认是 application/x-www-form-urlencoded,比如:

1 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post"> 

 2)创建处理文件上传Action类

  • 在Action类中声明相关属性:
    • 要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型,该属性用来保存临时文件;
    • 要声明[同名的属性]ContentType属性,类型是String类型,该属性表示上传文件的类型;
    • 要声明[同名的属性]FileName属性,类型是String类型,该文件表示要上传的文件;
    • 给所有属性提供get和set方法。
  • 在Action类中提供处理上传的方法:
    • 获取要保存文件的位置;
    • 在目标文件夹内,创建一个与上传文件同名的文件;
    • 通过FileUtils工具类提供copyFile()方法,将临时文件内容拷贝到目标文件夹下的那个同名的文件;
    • 调用保存临时文件的属性的delete()方法删除临时文件(也就是File类型属性的delete方法)。

 3)配置struts.

  • 设置上传文件大小,Struts2默认上传文件总大小为2MB,超过文件总大小,跳转input视图,通过<s:actionError /> 回显错误信息,在struts.
    1 <constant name="struts.multipart.maxSize" value="20000000"></constant>

    设置上传文件总大小,对所有上传form有效,只想对当前form进行设置,可以设置fileUpload拦截器属性

  • 在fileUpload拦截器中有三个属性:
    • protected Long maximumSize:可以设置每一个上传文件的大小
    • protected Set<String> allowedTypesSet:设置允许上传文件的类型
    • protected Set<String> allowedExtensionsSet:设置允许的上传文件的后缀名

可以在struts.

1 <interceptor-ref name="defaultStack">2   <!--配置上传文件的大小,这里配置的是上传文件的单个大小-->3   <param name="fileUpload.maximumSize">20971520</param>  4   <!-- 配置上传文件允许的类型-->5   <param name="fileUpload.allowedTypes">text/plain,application/msword</param>6   <!-- 配置上传文件的扩展名-->7   <param name="fileUpload.allowedExtensions">.txt,.doc</param>8 </interceptor-ref>

允许的类型(allowedTypes)和允许的扩展名(allowedExtensions)必须保持一致。

单文件上传示例:

 1)创建jsp页面 

1 <body>2 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">3   上传文件:<input type="file" name="upload">4   <input type="submit" value="上传">5 </form>6 </body>

 2)创建Action类

 1 public class UploadAction extends ActionSupport { 2   private File upload; 3   private String uploadContentType; 4   private String uploadFileName; 5    6   public File getUpload() { 7     return upload; 8   } 9 10   public void setUpload(File upload) {11     this.upload = upload;12   }13 14   public String getUploadContentType() {15     return uploadContentType;16   }17 18   public void setUploadContentType(String uploadContentType) {19     this.uploadContentType = uploadContentType;20   }21 22   public String getUploadFileName() {23     return uploadFileName;24   }25 26   public void setUploadFileName(String uploadFileName) {27     this.uploadFileName = uploadFileName;28   }29 30   @Override31   public String execute() throws Exception {32     ServletContext sc = ServletActionContext.getServletContext();33     //获取要保存文件的位置34     String path = sc.getRealPath("/upload");35     //创建一个与上传文件同名的文件36     File file = new File(path, uploadFileName);37     //将临时文件内容拷贝到目标文件夹下的那个同名的文件38     FileUtils.copyFile(upload, file);39     //删除临时文件40     upload.delete();41     return SUCCESS;42   }43 }

 3)配置struts.

 1 <struts> 2   <constant name="struts.devMode" value="true" /> 3   <constant name="struts.multipart.maxSize" value="200000000"/>  4   <package name="default" namespace="/" extends="struts-default"> 5     <action name="uploadAction" class="com.sunny.action.UploadAction"> 6       <result>/success.jsp</result> 7       <result name="input">/error.jsp</result> 8       <interceptor-ref name="defaultStack"> 9         <param name="fileUpload.maximumSize">20971520</param>10         <param name="fileUpload.allowedTypes">text/plain,application/msword</param>11         <param name="fileUpload.allowedExtensions">.txt,.doc</param>12       </interceptor-ref>13     </action>14   </package>15 </struts>

 4)上传文件界面

 5)上传成功后会跳转到success.jsp页面

 6)项目下的upload文件夹下会有上传的文件

上传问题信息国际化

Struts2上传问题信息默认的文件为在struts-message.properties下:

1 struts.messages.error.uploading=Error uploading: {0}2 struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}3 struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}4 struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

要想实现中文显示,需要在Action类相同文件下创建ActionClassName.properties文件,其中ActionClassName为上传Action类的类名,文件内容修改为:

1 struts.messages.error.uploading=上传错误: {0}2 struts.messages.error.file.too.large=上传文件太大: {0} "{1}" "{2}" {3}3 struts.messages.error.content.type.not.allowed=上传文件的类型不允许: {0} "{1}" "{2}" {3}4 struts.messages.error.file.extension.not.allowed=上传文件的后缀名不允许: {0} "{1}" "{2}" {3}

等号前面的内容固定,后面的内容可以自己写。

2、多文件上传

多文件上传的所有流程与单文件上传一致,但是需要注意的是:

  • 在页面中,虽然是多文件上传,但是页面中表单的name属性的值必须保持一致;
  • 在Action类中声明的相关属性,类型改成数组或者集合;
  • 在业务方法中,相关处理流程改成单文件上传的循环。

单文件上传示例:

 1)创建jsp页面 

1 <body>2 <form action="${pageContext.servletContext.contextPath}/uploadAction.action" enctype="multipart/form-data" method="post">3   上传文件:<input type="file" name="upload"><br>4   上传文件:<input type="file" name="upload"><br>5   上传文件:<input type="file" name="upload"><br>6   上传文件:<input type="file" name="upload"><br>7   <input type="submit" value="上传">8 </form>9 </body>

 2)创建Action类

 1 public class UploadAction extends ActionSupport { 2   private File[] upload; 3   private String[] uploadContentType; 4   private String[] uploadFileName; 5    6   public File[] getUpload() { 7     return upload; 8   } 9 10   public void setUpload(File[] upload) {11     this.upload = upload;12   }13 14   public String[] getUploadContentType() {15     return uploadContentType;16   }17 18   public void setUploadContentType(String[] uploadContentType) {19     this.uploadContentType = uploadContentType;20   }21 22   public String[] getUploadFileName() {23     return uploadFileName;24   }25 26   public void setUploadFileName(String[] uploadFileName) {27     this.uploadFileName = uploadFileName;28   }29 30   @Override31   public String execute() throws Exception {32     ServletContext sc = ServletActionContext.getServletContext();33     //获取要保存文件的位置34     String path = sc.getRealPath("/upload");35     //创建一个与上传文件同名的文件36     for (int i = 0; i < upload.length; i++) {37       File file = new File(path, uploadFileName[i]);38       //将临时文件内容拷贝到目标文件夹下的那个同名的文件39       FileUtils.copyFile(upload[i], file);40       //删除临时文件41       upload[i].delete();42     }43     return SUCCESS;44   }45 }

 3)配置struts.

 1 <struts> 2   <constant name="struts.devMode" value="true" /> 3   <constant name="struts.multipart.maxSize" value="200000000"/>  4   <package name="default" namespace="/" extends="struts-default"> 5     <action name="uploadAction" class="com.sunny.action.UploadAction"> 6       <result>/success.jsp</result> 7       <result name="input">/error.jsp</result> 8       <interceptor-ref name="defaultStack"> 9         <param name="fileUpload.maximumSize">20971520</param>10         <param name="fileUpload.allowedTypes">text/plain,application/msword</param>11         <param name="fileUpload.allowedExtensions">.txt,.doc</param>12       </interceptor-ref>13     </action>14   </package>15 </struts>

 4)上传文件界面

 5)上传成功后会跳转到success.jsp页面

 6)项目下的upload文件夹下会有上传的文件

 3、文件下载