关于Struts2的文件上传
2014-08-21 20:20
381 查看
要实现Struts2框架的文件上传,需要用到2个jar包
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
由于文件解析Struts2内部已经帮我们做好了,大大降低了开发难度,我们只需要在Action里设置好对应的参数,目录进行使用即可。
来个小示例:
upload.jsp
这个页面的表单有三点需要注意的:
1、表单必须使用post方式提交 2、表单编码类型 enctype="multipart/form-data" 3、<s:file label="上传文件:" name="upload"></s:file> name属性必须要写
UploadAction.java
这里有几个注意点:
1、三个成员变量的命名是有规范的:
private File upload里的的upoload一样要和你上传提交页面里的name属性值对应一致
文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName
2、提供setter方法,以便接收对应的数据
3、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置
struts.xml
看下效果:
![](http://images.cnitblog.com/blog/614265/201408/211925376438752.jpg)
![](http://images.cnitblog.com/blog/614265/201408/211926305651620.jpg)
到这里基本的上传操作已经完成了,下面来下关于上传文件的配置参数:
首先我们打开Struts2的核心包文件:
![](http://images.cnitblog.com/blog/614265/201408/211928132841567.jpg)
在这个文件里,我们可以找到一些关于Struts2的常量和默认参数设置
其中我们可以看到2个参数:
①struts.multipart.saveDir --默认的上传路径
②struts.multipart.maxSize=2097152 --默认上传文件的大小
若我们想改变参数设置,我们可以在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)
若我们想对单独的表单做设定,struts2的拦截器FileUpload有3个属性可以供我们选择
①fileUpload.maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
②fileUpload.allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
③fileUpload.allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
关于参数,我们可以打开struts2的核心包里的struts-default.xml进行查看
![](http://images.cnitblog.com/blog/614265/201408/211941014409310.jpg)
我们可以发现fielUpload拦截器处于Struts2默认的拦截栈里,并且可以发现这个拦截栈引用了workflow,调用Action的validate方法,一旦有错误返回,重新定位到INPUT页面
例如:我们保持以上上传代码不变,在配置文件的Actin里添加:
设置允许上传文件类型为txt,此时来看看效果:
![](http://images.cnitblog.com/blog/614265/201408/211951597061914.jpg)
很明显,上传失败了,也就意味我们的配置文件限制起作用了。
那么关于错误信息的回显
1、 若我们是针对常量做设置,出错则跳转input 视图, 通过 <s:actionError /> 回显错误信息
2、若我们是对fileLoad做设置,出错则在页面通过 <s:fieldError /> 回显错误信息
例如上面出现的回显错误信息File extension not allowed,我们可以在struts2的核心jar的struts-messages.properties里找到
![](http://images.cnitblog.com/blog/614265/201408/212002267373109.jpg)
其中的{0}{1}{2}{3}参数分别代表upload,"C和C++程序员的Lua快速入门.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf
我们可以来个国际化覆盖对应的key值,进行我们想要的回显信息:
![](http://images.cnitblog.com/blog/614265/201408/212017201433917.jpg)
我上传一个word文件,看下此时的页面效果:
![](http://images.cnitblog.com/blog/614265/201408/212018323466842.jpg)
搞定搞定,写博客还是蛮累的。。。关于Struts2的多文件上传请戳这里:/article/6145623.html
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
由于文件解析Struts2内部已经帮我们做好了,大大降低了开发难度,我们只需要在Action里设置好对应的参数,目录进行使用即可。
来个小示例:
upload.jsp
这个页面的表单有三点需要注意的:
1、表单必须使用post方式提交 2、表单编码类型 enctype="multipart/form-data" 3、<s:file label="上传文件:" name="upload"></s:file> name属性必须要写
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>上传文件示例</title> </head> <body> <s:actionerror/> <s:fielderror/> <s:form action="upload.action" theme="simple" namespace="/" method="post" enctype="multipart/form-data"> <s:file label="上传文件:" name="upload"></s:file> <s:submit value="提交上传"></s:submit> </s:form> </body> </html>
UploadAction.java
这里有几个注意点:
1、三个成员变量的命名是有规范的:
private File upload里的的upoload一样要和你上传提交页面里的name属性值对应一致
文件类型和文件名命名分别为:页面name属性值+ContentType,页面name属性值+FileName
2、提供setter方法,以便接收对应的数据
3、定义目标文件存放处,用commons-io-2.0.1.jar包提供的FileUtils工具类把上传文件复制到指定位置
package com.lcw.struts2.upload; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; public class UploadAction extends ActionSupport { //<s:file label="上传文件:" name="upload"></s:file> private File upload;//命名应该和上传页面name属性值保持一致 private String uploadContentType;//属性值+ContentType private String uploadFileName;//属性值+FielName public void setUpload(File upload) { this.upload = upload; } public void setUploadContentType(String uploadContentType) { this.uploadContentType = uploadContentType; } public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; } public String upload() { File destFile = new File(ServletActionContext.getServletContext() .getRealPath("/uploads") + "/" + uploadFileName); try { //工具类 FileUtils.copyFile(upload, destFile); } catch (IOException e) { e.printStackTrace(); } return SUCCESS; } }
struts.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <!-- 全局国际化配置 --> <constant name="struts.custom.i18n.resources" value="messages"></constant> <package name="struts2test" extends="struts-default"> <action name="upload" class="com.lcw.struts2.upload.UploadAction" method="upload"> <result name="success">/index.jsp</result> <result name="input">/upload.jsp</result> </action> </package> </struts>
看下效果:
![](http://images.cnitblog.com/blog/614265/201408/211925376438752.jpg)
![](http://images.cnitblog.com/blog/614265/201408/211926305651620.jpg)
到这里基本的上传操作已经完成了,下面来下关于上传文件的配置参数:
首先我们打开Struts2的核心包文件:
![](http://images.cnitblog.com/blog/614265/201408/211928132841567.jpg)
在这个文件里,我们可以找到一些关于Struts2的常量和默认参数设置
其中我们可以看到2个参数:
①struts.multipart.saveDir --默认的上传路径
②struts.multipart.maxSize=2097152 --默认上传文件的大小
若我们想改变参数设置,我们可以在struts.xml里配置,例如改变上传文件大小限定..于此类推(这里改变的是全局设定)
<constant name="struts.multipart.maxSize" value="200000"></constant>
若我们想对单独的表单做设定,struts2的拦截器FileUpload有3个属性可以供我们选择
①fileUpload.maximumSize: 上传文件的最大长度(以字节为单位), 默认值为 2 MB
②fileUpload.allowedTypes: 允许上传文件的类型, 各类型之间以逗号分隔
③fileUpload.allowedExtensions: 允许上传文件扩展名, 各扩展名之间以逗号分隔
关于参数,我们可以打开struts2的核心包里的struts-default.xml进行查看
![](http://images.cnitblog.com/blog/614265/201408/211941014409310.jpg)
我们可以发现fielUpload拦截器处于Struts2默认的拦截栈里,并且可以发现这个拦截栈引用了workflow,调用Action的validate方法,一旦有错误返回,重新定位到INPUT页面
例如:我们保持以上上传代码不变,在配置文件的Actin里添加:
<interceptor-ref name="defaultStack"> <param name="fileUpload.allowedExtensions">.txt</param> </interceptor-ref>
设置允许上传文件类型为txt,此时来看看效果:
![](http://images.cnitblog.com/blog/614265/201408/211951597061914.jpg)
很明显,上传失败了,也就意味我们的配置文件限制起作用了。
那么关于错误信息的回显
1、 若我们是针对常量做设置,出错则跳转input 视图, 通过 <s:actionError /> 回显错误信息
2、若我们是对fileLoad做设置,出错则在页面通过 <s:fieldError /> 回显错误信息
例如上面出现的回显错误信息File extension not allowed,我们可以在struts2的核心jar的struts-messages.properties里找到
![](http://images.cnitblog.com/blog/614265/201408/212002267373109.jpg)
其中的{0}{1}{2}{3}参数分别代表upload,"C和C++程序员的Lua快速入门.pdf" ,"upload__689312be_147f80f105d__8000_00000005.tmp" ,application/pdf
我们可以来个国际化覆盖对应的key值,进行我们想要的回显信息:
![](http://images.cnitblog.com/blog/614265/201408/212017201433917.jpg)
我上传一个word文件,看下此时的页面效果:
![](http://images.cnitblog.com/blog/614265/201408/212018323466842.jpg)
搞定搞定,写博客还是蛮累的。。。关于Struts2的多文件上传请戳这里:/article/6145623.html
相关文章推荐
- 关于Struts2的文件上传功能
- 关于在用struts2上传文件之后,会产生临时文件的问题
- 关于Struts2 文件上传下载
- 关于struts2上传时报临时文件找不到的问题
- 关于struts2文件上传中的uploadContentType和uploadFileName
- 关于 ‘Struts2教程:上传任意多个文件’ 文章
- 关于struts2上传文件报错“No result defined for action and result input”
- 关于Struts2的多文件上传
- 关于struts2文件上传中的uploadContentType和uploadFileName
- 关于struts2上传时报临时文件找不到的问题
- 关于Struts2上传文件的最大Size的设置
- 关于Struts2文件上传与自定义拦截器
- 关于struts2上传图片临时文件
- 一篇关于struts2文件上传的好文章
- 关于Struts2上传文件的最大Size的设置
- 关于Struts2文件上传Unable to find 'struts.multipart.saveDir'错误的解决
- 关于Struts2 上传文件获取文件名称和类型(标准做法)
- 关于struts2文件上传的一些笔记
- 关于Struts2上传文件的最大Size的设置
- 关于struts2文件上传中的uploadContentType和uploadFileName