利用Struct2进行文件的上传

先在配置好Struct2的开发环境,可以参考http://blog.csdn.net/ymfwj/article/details/51019573?locationNum=2,然后我们开始讲讲利用struct2框架进行文件的上传。

大概步骤如下

1). 表单需要注意的 3 点
1.要想使用 HTML 表单上传一个或多个文件须把 HTML 表单的 enctype 属性设置为 multipart/form-data
2.须把 HTML 表单的method 属性设置为 post
3.需添加 <input type=“file”> 字段. 

2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入
commons-fileupload-1.3.jar
commons-io-2.0.1.jar

3). Struts2 进行文件上传需要使用 FileUpload 拦截器

4). 基本的文件的上传: 直接在 Action 中定义如下 3 个属性, 并提供对应的 getter 和 setter
//文件对应的 File 对象
private File [fileFieldName];
//文件类型
private String [fileFieldName]ContentType;
//文件名
private String [fileFieldName]FileName;

5). 使用 IO 流进行文件的上传即可. 

6). 一次传多个文件怎么办 ?

若传递多个文件, 则上述的 3 个属性, 可以改为 List 类型! 多个文件域的 name 属性值需要一致. 

7). 可以对上传的文件进行限制吗 ? 例如扩展名, 内容类型, 上传文件的大小 ? 若可以, 则若出错, 显示什么错误消息呢 ? 消息可以定制吗 ? 

可以的!

可以通过配置 FileUploadInterceptor 拦截器的参数的方式来进行限制

maximumSize (optional) - 默认的最大值为 2M. 上传的单个文件的最大值

allowedTypes (optional) - 允许的上传文件的类型. 多个使用 , 分割

allowedExtensions (optional) - 允许的上传文件的扩展名. 多个使用 , 分割.

注意: 在 org.apache.struts2 下的 default.properties 中有对上传的文件总的大小的限制. 可以使用常量的方式来修改该限制

struts.multipart.maxSize=2097152

定制错误消息. 可以在国际化资源文件中定义如下的消息:

struts.messages.error.uploading - 文件上传出错的消息

struts.messages.error.file.too.large - 文件超过最大值的消息

struts.messages.error.content.type.not.allowed - 文件内容类型不合法的消息

struts.messages.error.file.extension.not.allowed - 文件扩展名不合法的消息

问题: 此种方式定制的消息并不完善. 可以参考 org.apache.struts2 下的 struts-messages.properties, 可以提供更多的定制信息.

例子如下:

提交表单upload.jsp:

<body>
	<s:form action="testUpload" method="post" enctype="multipart/form-data"
		theme="simple">
		PPTFile:<s:file name="ppt" label="PPTFile"></s:file>
		PPTDesc:<s:textfield name="pptDesc" label="PPTDesc"></s:textfield>
		<br>
		PPTFile:<s:file name="ppt" label="PPTFile"></s:file>
		PPTDesc:<s:textfield name="pptDesc" label="PPTDesc"></s:textfield>
		<br>
		PPTFile:<s:file name="ppt" label="PPTFile"></s:file>
		PPTDesc:<s:textfield name="pptDesc" label="PPTDesc"></s:textfield>
		<s:submit></s:submit>
	</s:form>
</body>
处理类UploadAction:
public class UploadAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	private List<File> ppt;
	private List<String> pptContentType;
	private List<String> pptFileName;
	private List<String> pptDesc;
	FileOutputStream out = null;
	FileInputStream in = null;
	public List<File> getPpt() {
		return ppt;
	}

	public void setPpt(List<File> ppt) {
		this.ppt = ppt;
	}

	public List<String> getPptContentType() {
		return pptContentType;
	}

	public void setPptContentType(List<String> pptContentType) {
		this.pptContentType = pptContentType;
	}

	public List<String> getPptFileName() {
		return pptFileName;
	}

	public void setPptFileName(List<String> pptFileName) {
		this.pptFileName = pptFileName;
	}

	public List<String> getPptDesc() {
		return pptDesc;
	}

	public void setPptDesc(List<String> pptDesc) {
		this.pptDesc = pptDesc;
	}

	@Override
	public String execute() throws Exception {
		System.out.println("上传的文件"+ppt);
		System.out.println("文件类型"+pptContentType);
		System.out.println("文件名"+pptFileName);
		System.out.println("文件描述"+pptDesc);
		ServletContext servletContext=ServletActionContext.getServletContext();
		String dir;
		for(int i=0;i<pptFileName.size();i++){
			dir=servletContext.getRealPath("/file/"+pptFileName.get(i));
			System.out.println(dir);
			out=new FileOutputStream(dir);
			in=new FileInputStream(ppt.get(i));
			byte[] buffer=new byte[8*1024];
			int len;
			while((len=in.read(buffer,0,buffer.length))!=-1){
				out.write(buffer);
			}
		}
		out.close();
		in.close();
		return "input";
	}

}
运行成功!然而我们还要对上传的文件进行控制怎么办呢

我们先配置一个国际化资源文件i18n.properties:
struts.messages.error.uploading - 文件上传出错的消息

struts.messages.error.file.too.large - 文件超过最大值的消息

struts.messages.error.content.type.not.allowed - 文件内容类型不合法的消息

struts.messages.error.file.extension.not.allowed - 文件扩展名不合法的消息

然后在Struct中配置文件:
<struts>
	<!-- 配置国际化资源文件 -->
	<constant name="struts.custom.i18n.resources" value="i18n"></constant>
    <package name="default" namespace="/" extends="struts-default">
    
	    <interceptors>
				<interceptor-stack name="ymfwjstack">
					<interceptor-ref name="defaultStack">
						<param name="fileUpload.maximumSize">2097152</param>
						<param name="fileUpload.allowedTypes">text/html,text/xml</param>
						<param name="fileUpload.allowedExtensions">html,dtd,xml</param>
					</interceptor-ref>
				</interceptor-stack>
		</interceptors>
		
		<default-interceptor-ref name="ymfwjstack"></default-interceptor-ref>
        <action name="testUpload" class="com.ymf.struct2.upload.UploadAction">
        	<result name="input">/upload.jsp</result>
        </action>
    </package>
</struts>

然后在upload.jsp的form表单中添加一条语句回显
<s:fielderror name="ppt"></s:fielderror>
<s:actionerror/>
最后测试,成功。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值