struts2--文件上传和uploadFile拦截器

单文件上传

1. 通过HTML表单上传文件时, 需要将表单的enctype属性设置为multipart/form-data, method属性设置为post. 

jsp页面代码:

Html代码 复制代码  收藏代码
  1. <form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"  
  2.       name="form1" method="post" enctype="multipart/form-data">  
  3.     上传文件名称: <input type="file" name="strutsUpload">  
  4.     <input type="submit" value="上传">  
  5. </form>  
<form action="${pageContext.request.contextPath}/upload/uploadAction_saveFile.action"
	  name="form1" method="post" enctype="multipart/form-data">
	上传文件名称: <input type="file" name="strutsUpload">
	<input type="submit" value="上传">
</form>

2. 在Action类中定义一下3个成员变量, 并为其提供getter和setter方法:

Java代码 复制代码  收藏代码
  1. private File strutsUpload; // 上传的文件  
  2. private String strutsUploadContentType;// 文件的类型  
  3. private String strutsUploadFileName;// 文件的名称  
private File strutsUpload; // 上传的文件
private String strutsUploadContentType;// 文件的类型
private String strutsUploadFileName;// 文件的名称

以上3个成员变量的名称不能随意更改, private File strutsUpload变量的名称必须和jsp中上传文件标签中的name属性的值一致. 而private String strutsUploadContentType变量的名称必须为"上传文件的名称+ContentType", private String strutsUploadFileName变量的名称必须为"上传文件的名称+FileName".

3. 在Action类中定义业务方法. 完整的Action类可以如下:

Java代码 复制代码  收藏代码
  1. public class UploadAction extends ActionSupport {   
  2.     private File strutsUpload; // 上传的文件  
  3.     private String strutsUploadContentType;// 文件的类型  
  4.     private String strutsUploadFileName;// 文件的名称  
  5.     // 业务方法   
  6.     public String saveFile() {   
  7.         try {   
  8.             ServletContext context = ServletActionContext.getServletContext();   
  9.             // 获得当前web应用所在目录下file文件夹的绝对路径   
  10.             String path = context.getRealPath("/file");   
  11.             File destFile = new File(path, strutsUploadFileName);   
  12.             if (!destFile.exists()) {   
  13.                 destFile.createNewFile();   
  14.             }   
  15.             FileUtils.copyFile(strutsUpload, destFile);   
  16.         } catch (IOException e) {   
  17.             e.printStackTrace();   
  18.             throw new RuntimeException(e);   
  19.         }   
  20.         return "success";   
  21.     }   
  22.     // 省略getter和setter方法   
  23. }  
public class UploadAction extends ActionSupport {
	private File strutsUpload; // 上传的文件
	private String strutsUploadContentType;// 文件的类型
	private String strutsUploadFileName;// 文件的名称
	// 业务方法
	public String saveFile() {
		try {
			ServletContext context = ServletActionContext.getServletContext();
			// 获得当前web应用所在目录下file文件夹的绝对路径
			String path = context.getRealPath("/file");
			File destFile = new File(path, strutsUploadFileName);
			if (!destFile.exists()) {
				destFile.createNewFile();
			}
			FileUtils.copyFile(strutsUpload, destFile);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
		return "success";
	}
	// 省略getter和setter方法
}

   *关于上传文件大小问题

使用Struts2的文件上传控件时,在struts.xml中,将处理上传的action中的fileUpload拦截器的maximumSize参数设置为5000000,上传了一个3M的文件后发现控制台报错,而且提示说文件超过2M。Struts.xml相关配置如下:
<action name="FileUpload" class="cn.timefly.strutsTest.FileUploadAction">
    <result name="success">/FileUploadResult.jsp</result>
    <result name="input">/FileUpload.jsp</result>
    <interceptor-ref name="fileUpload">
      <param name="maximumSize">500000</param>
      <param name="allowedTypes">application/vnd.ms-powerpoint</param>    
    </interceptor-ref>
<interceptor-ref name="defaultStack" />
    </action>

在struts.xml中加入 <constant name="struts.multipart.maxSize" value="9000000"/>
发现一切正常了,不报错了。功能也正常了。
发现struts.multipart.maxSize和fileUpload拦截器的maximumSize属性分工不同,总结如下:
1.struts.multipart.maxSize掌控整个项目所上传文件的最大的Size。超过了这个size,后台报错,程序处理不了如此大的文件。fielderror里面会有如下的提示:
the request was rejected because its size (16272982) exceeds the configured maximum (9000000)
2.fileUpload拦截器的maximumSize属性必须小于struts.multipart.maxSize的值。
struts.multipart.maxSize默认2M,当maximumSize大于2M时,必须设置struts.multipart.maxSize的值大于maximumSize。
3.当上传的文件大于struts.multipart.maxSize时,系统报错
当上传的文件在struts.multipart.maxSize和maximumSize之间时,系统提示:
File too large: file "MSF的概念.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
当上传的文件小于maximumSize,上传成功。

   *Unable to find ‘struts.multipart.saveDir’

  信息:  Unable to find 'struts.multipart.saveDir' property setting. Defaulting to javax.servlet.context.tempdir

原因是没有设置存放临时文件的文件夹,而错误提示中的struts.multipart.saveDir就是设置临时文件夹的属性,把该配置写到struts.properties文件中即可,如下:

struts.multipart.saveDir = /tmp

如果此文件夹不存在,Struts 2会自动创建一个。

也可以在struts.xml配置文件中添加一个常量设置:

<constant name="struts.multipart.saveDir" value="/tmp"></constant>

 

 

4. 在struts.xml文件中配置uploadFile拦截器的属性:

Xml代码 复制代码  收藏代码
  1. <package name="upload" namespace="/upload" extends="struts-default">  
  2.     <action name="uploadAction_*" class="cn.xing.upload.UploadAction" method="{1}">  
  3.         <interceptor-ref name="defaultStack">  
  4.             <!--   
  5.                 修改允许上传文件的大小(默认值是2M),   
  6.                 将调用FileUploadInterceptor中的setMaximumSize(223434555)   
  7.             -->  
  8.             <param name="fileUpload.maximumSize">223434555</param>  
  9.             <!-- 配置允许上传文件的类型,如果有多个类型用","隔开 -->  
  10.             <param name="fileUpload.allowedTypes">application/vnd.ms-excel,text/plain</param>  
  11.             <!--配置允许上传文件的扩展名,如果有多个用","隔开  -->  
  12.             <param name="fileUpload.allowedExtensions">txt,excel,ppt</param>  
  13.         </interceptor-ref>  
  14.         <result name="success">/upload/success.jsp</result>  
  15.         <result name="input">/upload/error.jsp</result>  
  16.     </action>  
  17. </package>  

 

多文件上传

多文件上传与单文件上传类似, 只有jsp表单和Action类的代码有所不同.

1. jsp表单代码:

Html代码 复制代码  收藏代码
  1. <form action="${pageContext.request.contextPath}/upload/uploadsAction_saveFiles.action"  
  2.       name="form1" method="post" enctype="multipart/form-data">  
  3.     上传文件名称: <input type="file" name="strutsUploads"><br>  
  4.     上传文件名称: <input type="file" name="strutsUploads"><br>  
  5.     上传文件名称: <input type="file" name="strutsUploads"><br>  
  6.     <input type="submit" value="上传">  
  7. </form>  
<form action="${pageContext.request.contextPath}/upload/uploadsAction_saveFiles.action"
	  name="form1" method="post" enctype="multipart/form-data">
	上传文件名称: <input type="file" name="strutsUploads"><br>
	上传文件名称: <input type="file" name="strutsUploads"><br>
	上传文件名称: <input type="file" name="strutsUploads"><br>
	<input type="submit" value="上传">
</form>

注意每个文件上传标签的name属性需要一致.

2. Action类:

Java代码 复制代码  收藏代码
  1. public class UploadsAction extends ActionSupport {   
  2.     private File[] strutsUploads;   
  3.     private String[] strutsUploadsContentType;   
  4.     private String[] strutsUploadsFileName;   
  5.     public String saveFiles() {   
  6.         ServletContext context = ServletActionContext.getServletContext();   
  7.         String realpath = context.getRealPath("/file");   
  8.         try {   
  9.             if (strutsUploads != null && strutsUploads.length > 0) {   
  10.                 for (int i = 0; i < strutsUploads.length; i++) {   
  11.                     File destFile = new File(realpath, strutsUploadsFileName[i]);   
  12.                     if (!destFile.exists()) {   
  13.                         destFile.createNewFile();   
  14.                     }   
  15.                     FileUtils.copyFile(strutsUploads[i], destFile);   
  16.                 }   
  17.             }   
  18.         } catch (IOException e) {   
  19.             e.printStackTrace();   
  20.         }   
  21.         return "success";   
  22.     }   
  23.     // 省略getter和setter方法   
  24. }  
public class UploadsAction extends ActionSupport {
	private File[] strutsUploads;
	private String[] strutsUploadsContentType;
	private String[] strutsUploadsFileName;
	public String saveFiles() {
		ServletContext context = ServletActionContext.getServletContext();
		String realpath = context.getRealPath("/file");
		try {
			if (strutsUploads != null && strutsUploads.length > 0) {
				for (int i = 0; i < strutsUploads.length; i++) {
					File destFile = new File(realpath, strutsUploadsFileName[i]);
					if (!destFile.exists()) {
						destFile.createNewFile();
					}
					FileUtils.copyFile(strutsUploads[i], destFile);
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "success";
	}
	// 省略getter和setter方法
}

多文件上传时, Action中的3个成员变量的名称需要遵循与单文件上传时相同的规则. 此时3个成员变量均为数组.

3. 在struts.xml文件中配置uploadFile拦截器的属性, 同上.

 

错误显示

当文件上传过程中出错时, 如果定义了错误显示页面, 将跳转到指定的页面, 并输出错误信息.

1. 在action标签下定义如下子标签:

<!-- 定义上传出错要转向的页面 -->

<result name="input">/upload/error.jsp</result>

2. /upload/error.jsp页面可以使用<s:fielderror/>标签输出错误信息.

前提是已经使用taglib指令导入了struts标签库:

<%@ taglib uri="/struts-tags" prefix="s"%>

3. 默认的错误信息为英文, 在struts2-core-2.x.x.x.jar\org\apache\struts2\struts-messages.properties文件中定义:

struts.messages.error.uploading=Error uploading: {0}

struts.messages.error.file.too.large=File too large: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=Content-Type not allowed: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=File extension not allowed: {0} "{1}" "{2}" {3}

{0}:<input type=“file” name=“uploadImage”>中name属性的值

{1}:上传文件的名称

{2}:上传文件保存到临时目录的名称

{3}:上传文件的类型(对struts.messages.error.file.too.large是上传文件的大小)

我们可以在Action的统计目录下创建一个fileuploadmessage.properties文件, 文件名没有要求, 但必须是properties文件, 在其中输入:

struts.messages.error.uploading=上传错误: {0}

struts.messages.error.file.too.large=文件太大: {0} "{1}" "{2}" {3}

struts.messages.error.content.type.not.allowed=不支持的文件类型: {0} "{1}" "{2}" {3}

struts.messages.error.file.extension.not.allowed=不支持的文件扩展名: {0} "{1}" "{2}" {3}

使用jdk目录下的native2ascii工具将中文转为unicode编码.

接下来需要在struts.xml文件中加载自定义的资源文件:

<constant name="struts.custom.i18n.resources" value="cn.xing.upload.fileuploadmessage"></constant>

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值