struts2上传文件

转自:http://ryxxlong.iteye.com/blog/809863

一、struts2上传单个文件

第一步:确保在WEB-INF/lib在commons-fileupload-x.x.x.jar、commons-io-x.x.x.jar两个jar文件。这两个文件可以从struts2下载文件中的lib中找到,或者到http://commons.apache.org/下载。

第二步:把form表的enctype设置为:"multipart/form-data",method设置成"post"如下:

Html代码 收藏代码
  1. <formenctype="multipart/form-data"action="${pageContext.request.contextPath}/xxx.action"method="post">
  2. <inputtype="file"name="uploadFile">
  3. </form>

第三步:在Action类中添加以下属性,action类的代码如下所示:

Java代码 收藏代码
  1. importorg.apache.commons.io.FileUtils;
  2. importorg.apache.struts2.ServletActionContext;
  3. importcom.opensymphony.xwork2.ActionContext;
  4. publicclassTestAction{
  5. privateFileuploadFile;//得到上传的文件,此属性对应于表单中文件字段的名称
  6. //下面的这两个属性的命名必须遵守上定的规则,即为"表单中文件字段的名称"+"相应的后缀"
  7. privateStringuploadFileContentType;//得到上传的文件的数据类型,
  8. privateStringuploadFileFileName;//得到上传的文件的名称
  9. publicFilegetUploadFile(){
  10. returnuploadFile;
  11. }
  12. publicvoidsetUploadFile(FileuploadFile){
  13. this.uploadFile=uploadFile;
  14. }
  15. publicStringgetUploadFileContentType(){
  16. returnuploadFileContentType;
  17. }
  18. publicvoidsetUploadFileContentType(StringuploadFileContentType){
  19. this.uploadFileContentType=uploadFileContentType;
  20. }
  21. publicStringgetUploadFileFileName(){
  22. returnuploadFileFileName;
  23. }
  24. publicvoidsetUploadFileFileName(StringuploadFileFileName){
  25. this.uploadFileFileName=uploadFileFileName;
  26. }
  27. publicStringexecute()throwsException{
  28. StringrealPath=ServletActionContext.getServletContext().getRealPath("/images");
  29. System.out.println(realPath);
  30. if(uploadFile!=null){
  31. FiledestFile=newFile(newFile(realPath),uploadFileFileName);//根据parent抽象路径名和child路径名字符串创建一个新File实例。
  32. if(!destFile.getParentFile().exists())//判断路径"/images"是否存在
  33. destFile.getParentFile().mkdirs();//如果不存在,则创建此路径
  34. //将文件保存到硬盘上,因为action运行结束后,临时文件就会自动被删除
  35. FileUtils.copyFile(uploadFile,destFile);
  36. ActionContext.getContext().put("message","文件上传成功!");
  37. }
  38. return"success";
  39. }
  40. }

form.jsp页面的代码如下所示:

Html代码 收藏代码
  1. <body>
  2. <formaction="${pageContext.request.contextPath}/demo/test.action"method="post"enctype="multipart/form-data">
  3. 文件:<inputtype="file"name="uploadFile"></input>
  4. <inputtype="submit"name="submit"value="上传"></input>
  5. </form>
  6. </body>

代码${pageContext.request.contextPath }等于<%=request.getContextPath() %>。

result.jsp页面的代码如下:

Html代码 收藏代码
  1. <body>
  2. 文件类型:${uploadFileContentType}<br>
  3. ${uploadFileFileName}${message}
  4. </body>

本人 进行测试,发现此时只要上传的文件不要超过2M,都可以顺利上传成功。上传完成后会返回文件的文件名等信息。如下所示:

文件类型:application/octet-stream

desktop.ini 文件上传成功!

在应用程序部署的文件夹下会产生一个images文件夹,在此文件夹下会有一个desktop.ini文件。

同进在控制台打印了如下的信息,说明上传时产生的临时文件删除成功:

2010-11-12 14:52:59 com.opensymphony.xwork2.util.logging.jdk.JdkLogger info
信息: Removing file uploadFile D:\workspace\eclipsespace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\struts_helloworld\upload__43a41dcc_12c3ec6e75a__8000_00000002.tmp

但要是我上传一个大于2M的文件,就会上传失败,控制台打印的信息如下所示:

警告: Unable to parse request
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

。。。

警告: the request was rejected because its size (3018061) exceeds the configured maximum (2097152)

这是因为struts2一次上传文件时默认的总大小是2097152B,所以在默认情况下上传的文件不能大于2M。

此时在struts.xml文件中,增加代码<constant name="struts.multipart.maxSize" value="10701096"/> ,

将它的文件上传限制设为10M左右,上面的文件就能正常上传了。配置文件如下所示:

Xml代码 收藏代码
  1. <struts>
  2. <constantname="struts.multipart.maxSize"value="10701096"/>
  3. <packagename="myDemo"namespace="/demo"extends="struts-default">
  4. <actionname="test"class="demo.action.TestAction">
  5. <result>/WEB-INF/jsp/result.jsp</result>
  6. </action>
  7. </package>
  8. </struts>

注意:struts2中的文件限制参数<constant name="struts.multipart.maxSize" value="10701096"/>并不是可以无限制的改大的,一般不能太大,以不超过10M的文件。这是因为web的性质决定的。基于web上传的文件都不能太大,如果要上传更大的文件,可以考虑使用浏览器插件(其实是一种通讯软件),类似于迅雷这样子的软件。这些软件都是基于socket来上传文件的。

二、struts2上传多文件

<1> 在form表单中的有多个file类型的input节点

Html代码 收藏代码
  1. <body>
  2. <formaction="${pageContext.request.contextPath}/demo/test.action"method="post"enctype="multipart/form-data">
  3. 文件1:<inputtype="file"name="uploadFiles"></input>
  4. 文件2:<inputtype="file"name="uploadFiles"></input>
  5. 文件3:<inputtype="file"name="uploadFiles"></input>
  6. <inputtype="submit"name="submit"value="上传"></input>
  7. </form>
  8. </body>

<2>action类如下所示:

Java代码 收藏代码
  1. publicclassTestAction{
  2. //可以定义成数组类型,也可以定义成list
  3. privateFile[]uploadFiles;//得到上传的文件,此属性对应于表单中文件字段的名称
  4. //下面的这两个属性的命名必须遵守上定的规则,即为"表单中文件字段的名称"+"相应的后缀"
  5. privateString[]uploadFilesContentType;//得到上传的文件的数据类型,
  6. privateString[]uploadFilesFileName;//得到上传的文件的名称
  7. //setter和getter方法
  8. publicStringexecute()throwsException{
  9. StringrealPath=ServletActionContext.getServletContext().getRealPath(
  10. "/images");
  11. Filefile=newFile(realPath);
  12. if(!file.exists())
  13. file.mkdirs();
  14. if(uploadFiles!=null){
  15. for(inti=0;i<uploadFiles.length;i++){
  16. FileuploadFile=uploadFiles[i];
  17. FileUtils.copyFile(uploadFile,newFile(file,
  18. uploadFilesFileName[i]));
  19. }
  20. ActionContext.getContext().put("message","文件上传成功!");
  21. }
  22. return"success";
  23. }
  24. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值