内容简介:我们在开发Web应用时,肯定要为用户提供上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理在Struts2的
前言
我们在开发Web应用时,肯定要为用户提供上传的功能,比如用户上传一张图像作为头像等。为了能上传文件,我们必须将表单的method设置为POST,将enctype设置为 multipart/form-data
。只有在这种情况下,浏览器才会把用户选择文件的二进制数据发送给服务器。这篇文章就对Struts2框架中的上传功能进行详细的总结。
Struts2的文件上传
Struts2并未提供自己的请求解析器,也就是说,Struts2不会自己去处理 multipart/form-data
的请求,它需要调用其它上传框架来解析二进制请求数据,但Struts2在原有的上传解析器基础上做了进一步封装,更进一步简化了文件上传。
在Struts2的 default.properties
配置文件中,可以看到这样的配置代码:
### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data # struts.multipart.parser=cos # struts.multipart.parser=pell # struts.multipart.parser=jakarta-stream struts.multipart.parser=jakarta # uses javax.servlet.context.tempdir by default struts.multipart.saveDir= struts.multipart.maxSize=2097152
上述代码主要用于配置Struts2上传文件时的上传解析器。Struts2的封装隔离了底层文件上传组件的区别,开发者只要在此配置文件上传所使用的解析器,就可以轻松地在不同的文件上传框架之间切换。
Struts2默认使用 jakarta
上传解析器,当然了,如果你不喜欢,你也可以换成别的。下面就通过代码来实现一个简单的基于Struts2的文件上传功能。
实现文件上传的Action
前台页面:
<form action="upload" method="post" enctype="multipart/form-data"> Title:<input type="text" name="title"><br> File:<input type="file" name="upload"><br> <input type="submit" value="submit"> </form>
Action类:
public class UploadAction extends ActionSupport { private String title; private File upload; private String uploadContentType; private String uploadFileName; private String savePath; public void setSavePath(String value) { this.savePath = value; } private String getSavePath() { String realPath = ServletActionContext.getServletContext().getRealPath("/WEB-INF/" + savePath); return realPath; } public void setTitle(String value) { this.title = value; } public String getTitle() { return title; } public void setUpload(File value) { this.upload = value; } public File getUpload() { return upload; } public void setUploadContentType(String value) { this.uploadContentType = value; } public String getFileContentType() { return uploadContentType; } public void setUploadFileName(String value) { this.uploadFileName = value; } public String getUploadFileName() { return uploadFileName; } @Override public String execute() throws Exception { FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getUploadFileName()); FileInputStream fis = new FileInputStream(getUpload()); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fis.close(); fos.close(); return SUCCESS; } }
struts.xml配置文件:
<package name="upload" extends="struts-default"> <action name="upload" class="com.jellythink.practise.UploadAction"> <param name="savePath">/upload</param> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> </action> </package>
对于Action类中,包含了两个特别的属性:
-
uploadContentType
-
uploadFileName
这两个属性分别用于封装上传文件的文件名、上传文件的文件类型。对于Struts2来说,如果Form表单中包含一个name属性为xxx的文件域,则对应的Action需要使用三个属性来封装该文件域的信息:
- 类型为File的xxx属性封装了该文件域对应的文件内容;
- 类型为String的xxxFileName属性封装了该文件域对应的文件的文件名;
- 类型为String的xxxContentType属性封装了该文件域对应的文件的文件类型。
通过上面的开发过程,可以看出通过Struts2实现文件上传确实是一件简单的事情。我们需要做的事情就是将文件域与Action中一个类型为File的属性关联,就可以轻松访问到上传文件的文件内容,至于Struts2如何使用Multipart解析器,对开发者完全透明。
手动实现文件过滤
很多时候,Web应用不允许用户自由上传,我们需要对用户上传的文件类型,文件大小进行限制,因此必须在文件上传过程中进行文件过滤。下面就先手动实现上传文件过滤。
在struts.xml中配置一个新的参数,表示支持的上传类型:
<param name="allowTypes">image/png,image/gif,image/jpeg</param>
在Action中添加验证函数:
// 进行验证 @Override public void validate() { String filterResult = filterType(getAllowTypes().split(",")); if (filterResult != null) { addFieldError("upload", "您要上传的文件类型不正确!"); } } public String filterType(String[] types) { String fileType = getFileContentType(); for (String type : types) { if (type.equals(fileType)) { return null; } } return ERROR; }
这只是实现了类型的判断,然后在根据File类的length()方法,来实现大小的验证。但是好麻烦,接下来就说一种更简单的说法。
拦截器实现文件过滤
Struts2提供了一个文件上传的拦截器,通过配置拦截器可以更轻松地实现文件过滤。Struts2中文件上传的拦截器 fileUpload
,为了让该拦截器起作用,只需要在该Action中配置该拦截器引用即可。
配置 fileUpload
拦截器时,可以为其指定两个参数:
-
allowedTypes
:该参数指定允许上传的文件类型,多个文件类型之间以英文逗号隔开 -
maximumSize
:该参数指定允许上传的文件大小,单位是字节<!-- 配置fileUpload拦截器 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/gif,image/jpeg</param> <param name="maximumSize">20000000</param> </interceptor-ref> <!-- 配置系统默认的拦截器 --> <interceptor-ref name="defaultStack" /> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result>
这样子,修改配置就可以搞定的事情,比写一坨代码真的轻松多了。
配置错误信息
对于上传出现错误的情况,系统默认都是提示英文的错误信息,但是为了输出国际化的提示信息,这就需要在国际化的资源配置文件中增加以下两个key的消息定义:
- struts.messages.error.content.type.not.allowed=上传文件类型不正确,请重新上传
- struts.messages.error.file.too.large=您上传的文件太大,请重新上传
接下来就可以使用 <s:fielderror/>
来输出错误信息了。
文件上传的常量配置
在文章的开始,我们说到 default.properties
中的配置,其中有一个 struts.multipart.saveDir
配置,那么该配置项的具体作用是什么呢?
在Struts2执行文件上传的过程中,需要指定一个临时文件夹,用来存放上传过程中产生的临时文件;如果没有指定临时文件夹,系统默认使用 javax.servlet.context.tempdir
,在Tomcat安装路径下的 work/Catalina/localhost/
路径下。而这个 struts.multipart.saveDir
就是配置临时文件的存放位置的。所以在开发的过程中,一定要注意该目录是否有读写权限哦。
还有一个 struts.multipart.maxSize
配置,该配置表示上传文件的大小,如果同时指定了这个配置和 fileUpload
拦截器的 maximumSize
属性,则先和 struts.multipart.maxSize
配置的比较,再和 fileUpload
拦截器的 maximumSize
属性比较,如果文件大小超过了 struts.multipart.maxSize
配置的,则会出现异常,并不会将Result转到input,这个一定要注意。
总结
这篇文章详细的总结了Struts2中的文件上传,内容有点多,基本都是手册上的内容,也罢,就当手册了。
果冻想,认真玩技术的地方。
2016年4月12日 于呼和浩特。
以上所述就是小编给大家介绍的《Struts2学习之文件上传》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Go Web 编程
[新加坡]Sau Sheong Chang(郑兆雄) / 黄健宏 / 人民邮电出版社 / 2017-11-22 / 79
《Go Web 编程》原名《Go Web Programming》,原书由新加坡开发者郑兆雄(Sau Sheong Chang)创作、 Manning 出版社出版,人名邮电出版社引进了该书的中文版权,并将其交由黄健宏进行翻译。 《Go Web 编程》一书围绕一个网络论坛 作为例子,教授读者如何使用请求处理器、多路复用器、模板引擎、存储系统等核心组件去构建一个 Go Web 应用,然后在该应用......一起来看看 《Go Web 编程》 这本书的介绍吧!