struts2官方的文件上传教程
http://struts.apache.org/2.2.1.1/docs/file-upload.html
http://struts.apache.org/2.2.1.1/docs/file-upload-interceptor.html
教程附带了类型拦截器,用来过滤上传的文件.但只有基本的一些信息,下面我会把其它没写到的补上或做个说明.
尽量保证文件上传的流程中,request不会被别的程序提前处理.不然struts可能找不到要处理的上传文件.
UploadAction 扩展自 com.opensymphony.xwork2.ActionSupport;可以直接用来处理文件上传.所以没必要再去研究 commons-fileupload 的上传,不过研究下也没坏处.
JSP:注意这里的 name="upload" 这个 upload 是我们以后在action里要写的 set 方法的关键字.
<s:form action="doUpload" method="post" enctype="multipart/form-data">
<s:file name="upload" label="File"/>
<s:submit/>
</s:form>
UploadAction 中有3个成员变量
private File file; //上传的文件
private String contentType; //上传的文件类型
private String filename; //上传的文件名
public void setUpload(File file)
public void setUploadContentType(String contentType)
public void setUploadFileName(String filename)
网上有些教程是按
[File Name]
[File Name]ContentType
[File Name]FileName
这种格式写这3个成员变量.假设 [File Name] = abc,那么下面的 2 个变量就是 abcContentType 和 abcFileName ,然后给这3个成员变量写 set 方法 ,JSP的<s:file name="abc" label="File"/>. 注意 [File Name] 尽量不写成 upload .可能会导致 空指针 的错误.
下面是我自己的保存文件代码.保存路径: 根目录的/uploadFiles/日期/文件名
public String execute() {
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
String serverPath = ServletActionContext.getServletContext().getRealPath("//");
try {
String fullFileName = serverPath+"uploadFiles//"+date+"//"+filename;
System.out.println(fullFileName);
if(filename!=null)FileUtils.copyFile(file, new File(fullFileName));
} catch (Exception e) {
e.printStackTrace();
}
return SUCCESS;
}
拦截器:
struts.xml里这么写就可以过滤非 image/png,image/gif,image/jpeg 指定的文件.
<action name="doUpload" class="com.example.UploadAction">
<interceptor-ref name="fileUpload">
<param name="allowedTypes">image/png,image/gif,image/jpeg</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">good_result.jsp</result>
</action>
因为这个拦截器是官方提供的.所以我们只需要写拦截器的参考名 interceptor-ref name="fileUpload" 而不需要特别指定这个 fileUpload 是谁.
除了 allowedTypes 类型拦截外,还有另外2个属性:
maximumSize : 最大上传限制,单位是 bytes .默认是最大能上传 2 M 的文件(1024*1024*2)
allowedExtensions : 扩展名限制,和 allowedTypes 是差不多的,只是不再写 image/png 而是改成 .png
allowedExtensions 和 allowedTypes 要限制多个,中间用逗号"," 隔开