Struts2学习手册之文件上传基础教程
作者:果冻想 发布时间:2021-10-11 19:27:07
前言
我们在开发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中的文件上传,内容有点多,基本都是手册上的内容,也罢,就当手册了。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
来源:https://www.jellythink.com/archives/299


猜你喜欢
- 本文实例为大家分享了Android调用手机摄像头拍照和录音功能的具体代码,供大家参考,具体内容如下调用摄像头拍照:public class
- 实体类时间格式化java 实体类 时间格式化注解@JsonFormat(pattern = "yyyy-MM-dd HH:mm:s
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- 首先在pom文件里引入mqtt的依赖配置<!--mqtt--> <d
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如
- 前言java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也不能做出来非常好用,
- 前言由于不小心将and或者or写在了语句后面,导致mybatis无法自主判别,这种问题在新上手的同学中很是常见。下面我们探讨一下,在哪些情况
- 本文实例讲述了java实现的冒泡排序算法。分享给大家供大家参考,具体如下:public class PaoPaixu { pub
- 本文实例为大家分享了Java实现员工管理系统的具体代码,供大家参考,具体内容如下本系统主要练习到的相关内容: 1、 流程控制语句 2、 类、
- 线程的状态New表示线程已创建,没启动的状态此时已经做了一些准备工作,还没有执行run方法中代码Runnable调用start方法之后的状态
- 目录I. 环境配置1. 项目配置2. 数据库表II. 传参类型确定1. 参数类型为整形2. 指定jdbcType3. 传参类型为String
- 概述Spring Boot简化了Spring应用的开发过程,遵循约定优先配置的原则提供了各类开箱即用(out-of-the-box)的框架配
- 1. 概述本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等。在下面的描述中,将以"中文"两
- 一、概念和原理RPC(remote procedure call),远程过程调用,是客户端应用和服务端之间的会话。在客户端,它所需要的一些功
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:public class RoundImageView extends ImageVie
- 需求分析需求一:图片列表查询,从后台返回数据,将数据展示在页面上需求二:新增图片,将新增图书的数据传递到后台,并在控制台打印说明:此次案例的
- springboot+mybatis+前端vue,使用前后端分离架构实现的个人博客系统,共7个模块,首页,写博客,博客详情页,评论管理,文章
- 这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码import java.net.URL;import java.net.
- 前言首先,synchronized 是什么?我们需要明确的给个定义——同步锁,没错,它就是把锁。可以
- 一,需求来源在开发过程中,可能会要使用Win7 ,Win8 ,Win10等不同版本的系统去做兼容性调试,也有时候会去针对特别的显卡,无线网卡