在之前博客 Java Web 通过JSP上传文件实例,使用了html中内置的file标签<input type="file" name="file" value="浏览文件">
进行文件上传。在Struts的内置标签库中,同样也提供了file标签,用户文件上传,称为文件选择域。使用Struts标签库中的file标签,在后端框架会自动进行文件接收,底层细节不用我们关注,这也正是框架的主要作用。
使用Struts标签库中的file文件上传时,表单必须是post方法,并且enctype
类型必须为multipart/form-data
。并且还需要在前端界面导入struts标签库,在jar包导入
commons-fileupload.jar
以及commons-io.jar
包。
1、文件上传实例
①、项目目录结构
②、UploadFileAction类
package cn.hestyle.web.action;
import com.opensymphony.xwork2.ActionSupport;
import java.io.File;
public class UploadFileAction extends ActionSupport {
//struts会自动将前端发送的文件转化为一个对象(临时对象)
private File photo;
//ContentType、FileName必须与文件名一一对应
private String photoContentType;
private String photoFileName;
//并且需要提供三个属性的setter方法
public File getPhoto() {
return photo;
}
public void setPhoto(File photo) {
this.photo = photo;
}
public String getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String photoContentType) {
this.photoContentType = photoContentType;
}
public String getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String photoFileName) {
this.photoFileName = photoFileName;
}
public String upload(){
System.out.println("文件类型:" + photoContentType);
System.out.println("文件名称:" + photoFileName);
return "success";
}
}
如果未添加photoContentType
、photoFileName
方法,控制台会报错。
③、前端jsp界面
uploadFile.jsp
文件
<%--
Created by IntelliJ IDEA.
User: hestyle
Date: 2019/10/24
Time: 8:26 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 使用struts内置标签,必须导入struts标签库 --%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<%-- 请求方式必须为post,并且enctype为multipart/form-data类型 --%>
<s:form action="upload" method="POST" enctype="multipart/form-data">
<%-- name必须与action处理类字段一一对应 --%>
<s:file label="照片" name="photo"></s:file>
<s:submit value="上传"></s:submit>
</s:form>
</body>
</html>
success.jsp
文件
<%--
Created by IntelliJ IDEA.
User: hestyle
Date: 2019/10/24
Time: 8:26 下午
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
文件上传成功!
</body>
</html>
④、struts.xml
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 开启开发模式 -->
<constant name="struts.devMode" value="true"></constant>
<package name="p1" extends="struts-default">
<action name="upload" class="cn.hestyle.web.action.UploadFileAction" method="upload">
<!-- 如果出现字段错误,返回到uploadFile.jsp界面 -->
<result name="input">/uploadFile.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
⑤、浏览器访问
控制台输出
2、增加文件类型约束
在上面的文件上传实例中,用户可以上传任意文件类型的文件,但是我们的需求是一张图片,所以我们需要对用户上传的文件进行类型约束。
方式一:添加文件类型限制
在默认拦截器组中添加文件上传允许的文件类型参数。
方式二:添加文件扩展名限制
往默认拦截器组中添加文件上传允许的文件扩展名参数
两种方法都必须提供input结果视图为上传文件的jsp才能看到报错信息。
3、增加文件大小约束
有些道友可能已经发觉了这个问题,我们还没有对文件大小进行限制,那岂不是客户能上传一张几个G的图片?
但是struts默认情况下设置了2MB以内的限制。
现在我们将它修改为10KB的大小限制。
在前端界面添加显示文件上传大小超限标签。
:如果你上传问题提示连接重置
此问题在用tomcat7/8/9版本会出现,原因是Tomcat7/8/9与struts2的兼容性问题:
当request的最大的字节数(不包括传输编码开销)超过tomcat服务器conf文件server.xml中maxSwallowSize的设置值将会被Tomcat终止上传,tomcat会判定是个失败的上传,不会把这个request再传送到应用的servlet对象,所以不会有应用的servlet对这个request没有任何响应。
但是客户端收不到超过上传限制的response,所以客户端会仍然发送它。所以tomcat会发送一个连接重置给客户端(浏览器)。
这样就会出现文件上传 超过大小限制无法跳转至指定input页面,浏览器提示连接已重置的问题。
解决方法:
如果server.xml中配置了maxSwallowSize,修改为更大,否则默认是2MB。
或者选择一个不超过2MB但是比我们刚刚配置的struts上传大小限制大的文件。
4、修改为中文提示
可以看出,刚刚的格式错误提示、大小超限提示都是英文,我们可以将它修改为中文提示。
原文提示定义在struts2-core.jar\org.apache.struts2\struts-message.properties
中
第一步:在src创建fileupload_message.properties
文件。
首先修改IDEA的properties文件默认编码类型,
struts.messages.error.uploading=文件上传错误: {0}
struts.messages.error.content.type.not.allowed=文件类型不被允许: {0} "{1}" {3}
struts.messages.error.file.extension.not.allowed=文件扩展名不被允许: {0} "{1}" {3}
struts.messages.upload.error.SizeLimitExceededException=文件最大大小限制: {0} 上传的文件大小为: {1}!
第二步:修改默认资源文件(注意不写后缀!!!)
第三步:浏览器测试
5、修改为多文件上传
修改uploadFile.jsp
文件
我这里偷了一下懒,将所有文件标签统一命名,多文件给struts处理。当然你也可以给每个file标签命不同名字,这样在upload类中就定义多个属性。
修改UploadFileAction类,将photo、photoContentType、photoFileName修改为数组类型,struts会自动接收多文件。
package cn.hestyle.web.action;
import com.opensymphony.xwork2.ActionSupport;
import java.io.File;
public class UploadFileAction extends ActionSupport {
//struts会自动将前端发送的文件转化为一个对象(临时对象)
private File[] photo;
//ContentType、FileName必须与文件名一一对应
private String[] photoContentType;
private String[] photoFileName;
public File[] getPhoto() {
return photo;
}
public void setPhoto(File[] photo) {
this.photo = photo;
}
public String[] getPhotoContentType() {
return photoContentType;
}
public void setPhotoContentType(String[] photoContentType) {
this.photoContentType = photoContentType;
}
public String[] getPhotoFileName() {
return photoFileName;
}
public void setPhotoFileName(String[] photoFileName) {
this.photoFileName = photoFileName;
}
public String upload(){
int fileCount = photo.length;
for (int i = 0; i < fileCount; ++i) {
System.out.println("文件类型:" + photoContentType[i] + "\t文件名称:" + photoFileName[i]);
}
return "success";
}
}
控制台输出
以上只是演示了文件上传,并没有保存文件,文件对象struts都给你弄好了,直接写入磁盘即可。
以上就是Struts2框架之文件上传的主要内容,大家给个关注、点个赞呗,好久没人关注了。。。