1、1. struts2 中的文件上传 第一步:在 WEB=INF/lib 下加入 commons-fileupload-1.2.1.jar , commons-io-1.3.2.jar。 第二步:把 form 表单的 enctype 属性设置为“multipart/form-data“,如 Java 代码 1. 2. 文件: 3. 4. 5. /$pageContext.request.contextPath:获取服务器根路径 第三步:在 action 中添加一下属性, Java 代码 1. public class HelloWorldAction 2. private File image;
2、 /与 jsp 表单中的名称对应 3. private String imageFileName; /FileName 为固定格式 4. private String imageContentType ;/ContentType 为固定格式 5. 6. public String getImageContentType() 7. return imageContentType; 8. 9. public void setImageContentType(String imageContentType) 10. this.imageContentType = imageContentType;
3、11. 12. public String getImageFileName() 13. return imageFileName; 14. 15. public void setImageFileName(String imageFileName) 16. this.imageFileName = imageFileName; 17. 18. public File getImage() 19. return image; 20. 21. public void setImage(File image) 22. this.image = image; 23. 24. public Strin
4、g execute() throws Exception 25.System.out.println(“imageFileName = “+imageFileName); 26.System.out.println(“imageContentType = “+imageContentType); 27. /获取服务器的根路径 realpath 28. String realpath = ServletActionContext.getServletContext().getRealPath(“/images“); 29.System.out.println(realpath); 30. if(
5、image!=null) 31. File savefile = new File(new File(realpath), imageFileName); 32. if(!savefile.getParentFile().exists() savefile.getParentFile().mkdirs(); 33. FileUtils.copyFile(image, savefile); 34. ActionContext.getContext().put(“message“, “上传成功“); 35. else 36. ActionContext.getContext().put(“mess
6、age“, “上传失败“); 37. 38. return “success“; 39. 40. 此外,可以在 struts.xml 中配置上传文件的大小 /最大上传配置成 10M 默认的上传大小为 2M 思维拓展:如果要上传的文件非常大,如上传的是电影,好几百 M ,用 web 上传一般是不可能难上传成功的,这时候要安装一个插件,类似于应用程序 socket ,通过网络通讯上传。 2 . 多文件上传 在上面的基础上略加改动 1.jsp 表单 Java 代码 1. 2. 文件 1: 3. 文件 2: 4. 文件 3: 5. 6. 2. action 中用数组接收 Java 代码 1. publ
7、ic class HelloWorldAction 2. private File image; 3. private String imageFileName; 4. private String imageContentType ; 5. /省略了 set 和 get 方法 6. public String execute() throws Exception 7. 8. String realpath = ServletActionContext.getServletContext().getRealPath(“/images“); 9. System.out.println(realp
8、ath); 10. if(image!=null) 11. File savedir = new File(realpath); 12. if(!savedir.exists() 13. 14. savedir.mkdirs(); 15. 16. System.out.println(“image.length = “+image.length); 17. for(int i = 0 ; iStruts2 File Upload文件标题: 选择文件:此页面特殊之处只是把表单的 enctype 属性设置为 multipart/form-data。2.2. 步骤二:创建处理上传请求的 Action
9、 类package org.qiujy.web.struts2;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import org.apache.struts2.ServletActionContext;import com.o
10、pensymphony.xwork2.ActionSupport;/*处理文件上传的 Action 类*authorqiujy*version1.0*/publicclass FileUploadAction extends ActionSupport privatestaticfinalintBUFFER_SIZE = 16 * 1024;/ 文件标题private String title;/ 上传文件域对象private File upload;/ 上传文件名private String uploadFileName;/ 上传文件类型private String uploadConten
11、tType;/ 保存文件的目录路径(通过依赖注入 )private String savePath;/以下省略 getter 和 setter./自己封装的一个把源文件对象复制成目标文件对象privatestaticvoid copy(File src, File dst) InputStream in = null;OutputStream out = null;try in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);out = new BufferedOutputStream(new FileOutpu
12、tStream(dst),BUFFER_SIZE);byte buffer = newbyteBUFFER_SIZE;int len = 0;while (len = in.read(buffer) 0) out.write(buffer, 0, len); catch (Exception e) e.printStackTrace(); finally if (null != in) try in.close(); catch (IOException e) e.printStackTrace();if (null != out) try out.close(); catch (IOExce
13、ption e) e.printStackTrace();Overridepublic String execute() throws Exception /根据服务器的文件保存地址和原文件名创建目录文件全路径String dstPath = ServletActionContext.getServletContext().getRealPath(this.getSavePath()+ “ + this.getUploadFileName();System.out.println(“上传的文件的类型:“+ this.getUploadContentType();File dstFile = n
14、ew File(dstPath);copy(this.upload, dstFile);returnSUCCESS; 上面这个 Action 类中,提供了 title 和 upload 两个属性来分别对应页面的两个表单域属性,用来封装表单域的请求参数。但是,值得注意的是,此 Action 中还有两个属性:uploadFileName 和uploadContentType,这两个属性分别用于封装上传文件的文件名、文件类型。这是Struts2 设计的独到之处:Strut2 的 Action 类直接通过 File 类型属性直接封装了上传文件的文件内容,但这个 File 属性无法获取上传文件的文件名和
15、文件类型,所以 Struts2 就直接将文件域中包含的上传文件名和文件类型的信息封装到 uploadFileName 和uploadContentType 属性中,也就是说 Struts2 针对表单中名为 xxx 的文件域,在对应的Action 类中使用 3 个属性来封装该文件域信息:l 类型为 File 的 xxx 属性:用来封装页面文件域对应的文件内容。l 类型为 String 的 xxxFileName 属性:用来封装该文件域对应的文件的文件名。l 类型为 String 的 xxxContentType 属性:用来封装该文件域应用的文件的文件类型。另外,在这个 Action 类中还有一个
16、 savePath 属性,它的值是通过配置文件来动态设置的,这也是 Strut2 设计中的一个依赖注入特性的使用。2.3. 步骤三:配置struts.xml 文件:/upload/showupload.jsp在这个文件中跟以前配置唯一不同的是给 action 配置了一个元素,用来为该 Action 的 savePath 属性动态注入值。web.xml 中的配置跟以前的应用一样。说明一点:好多网络文章说 Struts2 上传时要在 web.xml 中配置一个名为 ActionContextUp 的过滤器,说是有一些莫名的错误,可是是我用了 Struts2 新版本 2.0.9GA 版,测了 n 次
17、,没出现什么问题,所以没配置。2.4. 运行调试:运行前要在根目录下创建一个名为 upload 的文件夹,用来存放上传后的文件。上传结果:3. 文件类型及错误输出:Struts2 提供了一个文件上传的拦截器(名为 fileUpload),通过配置这个拦截器能轻松地实现文件类型的过滤。在上例中,若要配置上传的文件只能是一些普通的图片文件格式:image/bmp、image/png、image/gif、image/jpeg、image/jpg 等,则可在 struts.xml 文件中按如下方式配置:image/bmp,image/png,image/gif,image/jpeg,image/jpg
18、 ,image/x-png, image/pjpeg102400/upload/index.jsp/showupload.jsp如果上传文件失败,系统返回到 input 对应的页面,要在 input 对应的页面输出文件过滤失败信息,可以在 input 对应的页面中增加 来显示错误信息。运行调试:结果:显然,这样的提示不太友好,应用使用国际化信息。在国际化资源文件中添加如下三句:#更改上传文件类型不允许的提示信息struts.messages.error.content.type.not.allowed=文件上传失败:你要上传的文件类型不允许#更改上传文件太大的提示信息struts.messages.error.file.too.large=文件上传失败:你要上传的文件太大#文件上传其它错误信息struts.messages.error.uploading=文件上传失败:发生内部错误 别忘了要用 native2ascii.exe 进行编码转换哦。再运行调试:另外,在控制台会看到一条消息: