--------------------siwuxie095
Struts2 文件上传
1、Web 阶段使用 FileUpload 组件实现文件上传,而 Struts2 使用
拦截器对 FileUpload 文件上传进行了封装
<interceptor-ref name="fileUpload"/>
2、对于上传文件的表单页面有三个要求:
(1)表单的提交方式必须是 post
(2)form 标签的 enctype 属性必须是 multipart/form-data
(3)表单中要有文件上传项:<input type="file" name=""/>
3、在 Action 中直接得到上传文件及其文件名,并提供二者
的 get 和 set 方法
(1)变量:上传文件,是 File 类型,必须和表单中文件上传项的 name 属性对应
(2)变量:文件名,是 String 类型,有固定格式:文件名 = 上传文件 + FileName
4、在 Struts2 的核心配置文件中配置上传文件的全局上限和局部上限
(1)上传文件的全局上限默认为 2 M,它是针对所有 Action 的
(2)上传文件的局部上限可以手动设置,它是针对某个 Action 的
「注意:局部上限绝对不能超过全局上限」
5、如果同时配置了全局上限和局部上限,在上传文件时,先判断全局
上限,后判断局部上限,不管哪个超出,都上传失败,且都自动返回结
果 input
「注意:需要在 Struts2 的核心配置文件中配置 input 对应的路径」
6、具体实现
(1)编写页面
add.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>上传文件</title> </head> <body>
<!-- Struts2 文件上传,必须使用 post,且要将 enctype 属性设置为 multipart/form-data --> <form action="${pageContext.request.contextPath }/user_add.action" method="post" enctype="multipart/form-data"> <!-- 此处 name 属性和 Action 中要上传的文件 upload 相同(对应) --> <input type="file" name="upload"/> <input type="submit" value="保存"/> </form> </body> </html> |
succ.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!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=UTF-8"> <title>上传成功</title> </head> <body>
<h1>上传成功! <a href="${pageContext.request.contextPath }/add.jsp">继续上传</a></h1> </body> </html> |
err.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 引入 Struts2 标签库 --> <%@ taglib uri="/struts-tags" prefix="s"%>
<!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=UTF-8"> <title>上传失败</title> </head> <body>
<h1>上传失败! <a href="${pageContext.request.contextPath }/add.jsp">重新上传</a></h1> <!-- 该标签主要用于调试,来查看具体是什么错误 但似乎只有在超出全局上限时,才有错误信息 --> <s:actionerror/> </body> </html> |
(2)编写 Action
UserAction.java:
package com.siwuxie095.action;
import java.io.File; import java.io.IOException;
import org.apache.commons.io.FileUtils;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport { /** * 要上传的文件(File)及其文件名(String) * * 并提供二者的 get 和 set 方法 * * 注意: * (1) 表单上传项的 name 属性值和这里的文件对应 * (2) 文件名 = 文件 + FileName,即是固定写法 */ private File upload; private String uploadFileName; public File getUpload() { return upload; }
public void setUpload(File upload) { this.upload = upload; }
public String getUploadFileName() { return uploadFileName; }
public void setUploadFileName(String uploadFileName) { this.uploadFileName = uploadFileName; }
/** * 上传文件 */ public String add() throws IOException { if (upload!=null) { /* * 先在 E 盘的 ServerFile 文件夹中创建一个以 uploadFileName 命名的文件 server * * 注意:文件夹路径也可以为 E:/ServerFile/ */ File server=new File("E:\ServerFile\"+uploadFileName); // 再将要上传的文件 upload 覆盖刚才创建的文件 server FileUtils.copyFile(upload, server); System.out.println(uploadFileName); System.out.println("-------------------------------------"); } /* * Struts2 文件上传的错误处理机制: * * 针对上传文件,先判断全局上限,再判断局部上限,不管哪个超出, * 都是上传失败,且都自动返回结果 input,即返回字符串 input */ return "add"; } } |
(3)在 Struts2 核心配置文件中进行配置
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置 Struts2 上传文件的全局上限,即所有 Action 都是如此, 默认为 2 M,即 2097152 字节(2*1024*1024),这里设置成 20 M 上传文件的全局上限:maxSize --> <constant name="struts.multipart.maxSize" value="20971520"></constant> <package name="demo" extends="struts-default" namespace="/"> <action name="user_*" class="com.siwuxie095.action.UserAction" method="{1}"> <result name="add">/succ.jsp</result> <!-- Struts2 文件上传的错误处理机制: 针对上传文件,先判断全局上限,再判断局部上限,不管哪个超出, 都是上传失败,且都自动返回结果 input,即返回字符串 input --> <result name="input">/err.jsp</result> <interceptor-ref name="fileUpload"> <!-- 允许的文件类型,如有多个,用逗号隔开 --> <!-- <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg</param> --> <!-- 设置 Struts2 上传文件的局部上限,即针对某个 Action 上传文件的局部上限:maximumSize 注意:上传文件的局部上限 < 上传文件的全局上限,即 maximumSize < maxSize 全局上限默认为 2 M,如果局部上限设置 > 2 M,就一定要把全局上限调的更大, 保证全局 > 局部 --> <param name="maximumSize">2097152</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 或者可以这么配置: <interceptor-ref name="defaultStack"> <param name="fileUpload.allowedTypes"> image/bmp,image/png,image/gif,image/jpeg </param> <param name="fileUpload.maximumSize">2097152</param> </interceptor-ref> --> </action> </package>
</struts> |
(4)访问路径
http://localhost:8080/工程名/add.jsp
7、注意事项
Tomcat 9 是截止目前的最新版本(2017/9/12),由于 Tomcat 7/8/9
和 Struts2 不兼容,导致上传文件超过全局上限 或 局部上限时,无法自
动跳转到 input 对应的路径
解决方法一:使用 Tomcat 6,干脆利落
解决方法二:在 Tomcat 的配置文件 server.xml 中进行如下配置:
找到第一个出现的 Connector 标签,在其中添加属性,
并设值:maxSwallowSize="-1"
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxSwallowSize="-1"/> |
参考链接:
【made by siwuxie095】