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 要限制多个,中间用逗号"," 隔开