基于 Struts2 的单文件和多文件上传
文件的上传下载是 Web 开发中老生常谈的功能,基于 Struts2 框架对于实现这一功能,更是能够给我们带来很多的便利。Struts2 已经有默认的 upload 拦截器。我们只需要写参数,它就会自动帮我们封装好。这篇我们就先来看一下基于 Struts2 的单文件和多文件上传。
一、 单文件上传
1.1 导 jar 包
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
ognl-3.0.6.jar
struts2-core-2.3.15.3.jar
xwork-core-2.3.15.3.jar
1.2 web.xml 配置 Struts2 核心过滤器
1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 5 </filter-class> 6 </filter> 7 8 <filter-mapping> 9 <filter-name>struts2</filter-name> 10 <url-pattern>/*</url-pattern> 11 </filter-mapping>
1.3 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致)
1 <!-- 文件上传的必要前提: 2 1.请求方式必须是post 3 2.enctype属性的取值必须是multipart/form-data 4 3.提供一个文件选择域 文件上传 5 --> 6 7 <s:form action="upload.action" enctype="multipart/form-data"> 8 9 <s:file name="myfile" label="请选择文件"></s:file> 10 <s:submit value ="提交"></s:submit> 11 12 </s:form>
1.4 实现文件上传的 UploadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 import javax.servlet.ServletContext; 5 import org.apache.commons.io.FileUtils; 6 import org.apache.struts2.ServletActionContext; 7 import com.opensymphony.xwork2.ActionSupport; 8 9 public class UploadAction extends ActionSupport { 10 11 //表单上提供的字段 12 private File myfile; 13 //struts2在文件上传时提供的属性 14 private String myfileFileName;//上传的文件名。上传字段名称+FileName 注意大小写 15 private String myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写 16 public String upload (){ 17 18 //1.拿到ServletContext 19 ServletContext servletContext = ServletActionContext.getServletContext(); 20 //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录 21 String realPath = servletContext.getRealPath("/WEB-INF/file"); 22 //3.如果这个真实的目录不存在,需要创建 23 File file = new File(realPath ); 24 if(!file.exists()){ 25 file.mkdirs(); 26 } 27 //4.把文件存过去 28 //拷贝:把文件的临时文件复制到指定的位置。注意:临时文件还在 29 //FileUtils.copyFile(myfile, new File(file,myfileFileName)); 30 31 //剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了 32 myfile.renameTo(new File(file,myfileFileName)); 33 return SUCCESS; 34 } 35 36 public File getMyfile() { 37 return myfile; 38 } 39 40 public void setMyfile(File myfile) { 41 this.myfile = myfile; 42 } 43 44 public String getMyfileFileName() { 45 return myfileFileName; 46 } 47 48 public void setMyfileFileName(String myfileFileName) { 49 this.myfileFileName = myfileFileName; 50 } 51 52 public String getMyfileContentType() { 53 return myfileContentType; 54 } 55 56 public void setMyfileContentType(String myfileContentType) { 57 this.myfileContentType = myfileContentType; 58 } 59 60 }
1.5 配置 struts.xml(注意:修改文件上传的总的大小。)
1 <struts> 2 <!--constant修改struts2的默认配置值 --> 3 <!--修改struct2称为开发模式,修改配置之后会自动加载 --> 4 <constant name="struts.devMode" value="true" /> 5 <!-- 限制上传文件的大小,第一种方式:通过修改struts2的常量。 6 在default.properties中配的struts.multipart.maxSize=2097152--> 7 <constant name="struts.multipart.maxSize" value="4097152" /> 8 9 <package name="p1" extends="struts-default"> 10 11 <action name ="upload" class = "com.fhcq.action.UploadAction" method="upload"> 12 13 <!-- 第二种方式:通过给fileUpload的拦截器注入参数的形式,控制上传文件的大小 14 无法使用 <param name="fileUpload.maximumSize">31457280</param>--> 15 <interceptor-ref name="defaultStack"> 16 <!-- 限制上传文件的扩展名。如果有多个,使用逗号分隔 17 <param name="fileUpload.allowedExtensions">jpg,png,bmp</param>--> 18 <!-- 限制上传文件的MIME类型。 如果有多个,使用逗号分隔 --> 19 <param name="fileUpload.allowedTypes">image/jpg,image/pjpeg,image/png 20 </param> 21 </interceptor-ref> 22 <result>/index.jsp</result> 23 <result name="input" type="redirect">/upload.jsp</result> 24 </action> 25 26 </package> 27 28 </struts>
1.6 配置 fileupload_message.properties,放置在 src 下用来显示错误的资源文件信息
1 struts.messages.error.content.type.not.allowed=\u4E0A\u4F20\u6587\u4EF6\u7684\u7C7B\u578B\u4E0D\u662F\u88AB\u652F\u6301\u7684: {0} "{1}" "{2}" {3}
二、 多文件上传
在以上单文件上传的基础上,修改内容如下:
2.1 JSP 文件上传页(注意 file 的 name 属性一定要与 Action 里面的 File 类型属性名一致)
1 <!-- 文件上传的必要前提: 2 1.请求方式必须是post 3 2.enctype属性的取值必须是multipart/form-data 4 3.提供一个文件选择域 5 --> 6 7 <s:form action="upload.action" enctype="multipart/form-data"> 8 9 <s:file name="myfile" label="请选择文件"></s:file> 10 <s:file name="myfile" label="请选择文件"></s:file> 11 <s:submit value ="提交"></s:submit> 12 13 </s:form>
2.2 实现文件上传的 UploadAction
1 package com.fhcq.action; 2 3 import java.io.File; 4 5 import javax.servlet.ServletContext; 6 7 import org.apache.struts2.ServletActionContext; 8 9 import com.opensymphony.xwork2.ActionSupport; 10 11 public class UploadAction extends ActionSupport { 12 13 //表单上提供的字段 14 private File[] myfile; 15 //struts2在文件上传时提供的属性 16 private String[] myfileFileName;上传的文件名。上传字段名称+FileName 注意大小写 17 private String[] myfileContentType;//上传文件的MIME类型。上传字段名称+ContentType 注意大小写 18 19 public String upload (){ 20 21 //1.拿到ServletContext 22 ServletContext servletContext = ServletActionContext.getServletContext(); 23 //2.调用realPath方法,获取根据一个虚拟目录得到的真实目录 24 String realPath = servletContext.getRealPath("/WEB-INF/files"); 25 //3.如果这个真实的目录不存在,需要创建 26 File file = new File(realPath ); 27 if(!file.exists()){ 28 file.mkdirs(); 29 } 30 //4.把文件存过去 31 //剪切:把临时文件剪切指定的位置,并且给他重命名。 注意:临时文件没有了 32 for(int i=0;i<myfile.length;i++){ 33 myfile[i].renameTo(new File(file,myfileFileName[i])); 34 } 35 36 return SUCCESS; 37 } 38 39 public File[] getMyfile() { 40 return myfile; 41 } 42 43 public void setMyfile(File[] myfile) { 44 this.myfile = myfile; 45 } 46 47 public String[] getMyfileFileName() { 48 return myfileFileName; 49 } 50 51 public void setMyfileFileName(String[] myfileFileName) { 52 this.myfileFileName = myfileFileName; 53 } 54 55 public String[] getMyfileContentType() { 56 return myfileContentType; 57 } 58 59 public void setMyfileContentType(String[] myfileContentType) { 60 this.myfileContentType = myfileContentType; 61 } 62 63 }