一、Struts2中简单的文件上传
1):表单必须使用POST方式提交;
2):使用二进制编码:enctype="multipart/form-data";
3):<input type="file" name=""/>;
4):通过struts2标签生成表单
5):Action中通过Set()方法获得表单中的数据
6):将通过网络获得的文件复制到服务器目的 文件中
7):文件上传成功
8):代码示例
upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<br>
<s:property value="#message"/>
<s:form action="/uploadxxx" method="post" enctype="multipart/form-data">
<s:textfield name="userName" label="操作人员"/><br>
<s:file name="file" label="文件" /><br>
<s:submit value="提交" /><br>
</s:form>
</body>
</html>
UploadAction.java
package org.openbox.upload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport{
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
//上传文件相关
private File file; //上传的文件
private String fileFileName; //文件原始名称
private String fileContentType; //文件的MIME类型
public void setFile(File file) {
this.file = file;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String fileUpload()throws Exception{
//获得文件上传存放目录
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
//创建一个目的文件
File destFile=new File(realPath,fileFileName);
//将当前获得的文件file,复制到目的文件中
FileUtils.copyFile(file, destFile);
//上传成功显示信息
ActionContext.getContext().put("message", "文件 "+fileFileName+" 上传成功");
return Action.SUCCESS;
}
}
配置文件struts-upload.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>
<package name="uploadPkg" namespace="/" extends="struts-default">
<!-- 配置ACTION -->
<action name="uploadxxx" class="org.openbox.upload.UploadAction" method="fileUpload">
<result name="success">/upload.jsp</result>
<allowed-methods>fileUpload</allowed-methods>
</action>
</package>
</struts>
二、文件上传的细节控制
1.文件的全局控制
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支持cos,pell,jakarta文件上传组件,默认使用的jakarta(Apache).
struts.multipart.saveDir= //上传文件的临时目录,默认是在Tomcat下面.
struts.multipart.maxSize=2097152 //一次请求允许上传文件的最大字节数,默认是2M.
2.单个文件上传控制
Struts2中的FileUploadInterceptor拦截器完成了文件上传的操作.
1):通过配置fileUpload拦截器参数,控制上传文件的大小和文件类型.
1:控制单个文件的最大字节.
2:控制上传文件的类型,比如png,jpg,jpeg,bmp.
拦截失败,返回错误信息
3:完整控制代码
struts-upload.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>
<package name="uploadPkg" namespace="/" extends="struts-default">
<interceptors>
<interceptor-stack name="mystack">
<!-- 自定义文件上传拦截器参数 -->
<interceptor-ref name="fileUpload">
<!-- 参数来源FileUploadInterceptor文件属性字段 -->
<param name="allowedExtensions">jpg,png</param>
<param name="maximumSize">102400</param>
</interceptor-ref>
<!-- 重新引用默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 全局引用自定义拦截器栈mystack -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 配置ACTION -->
<action name="upload" class="org.openbox.upload.UploadAction" method="fileUpload">
<result name="input">/upload.jsp</result>
<result name="success">/upload.jsp</result>
<allowed-methods>fileUpload</allowed-methods>
</action>
</package>
</struts>
UploadAction.java代码
package org.openbox.upload;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UploadAction extends ActionSupport{
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
//上传文件相关
private File file; //上传的文件
private String fileFileName; //文件原始名称
private String fileContentType; //文件的MIME类型
public void setFile(File file) {
this.file = file;
}
public void setFileFileName(String fileFileName) {
this.fileFileName = fileFileName;
}
public void setFileContentType(String fileContentType) {
this.fileContentType = fileContentType;
}
public String fileUpload()throws Exception{
//获得文件上传存放目录
String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
//创建一个目的文件
File destFile=new File(realPath,fileFileName);
//将当前获得的文件file,复制到目的文件中
FileUtils.copyFile(file, destFile);
//上传成功显示信息
ActionContext.getContext().put("message", "文件 "+fileFileName+" 上传成功");
return Action.SUCCESS;
}
}
三、重新定义文件上传拦截失败出错提示
1:找到配置文件struts-messages.properties文件
2:在struts.xml配置国际化
3:创建两种语言的国际化属性文件app_en_US.properties和app_zh_CN.properties
并在该文件中编辑属性
4:在jsp页面,使用国际化标签
四、文件下载
Struts2提供了stream结果类型,该结果类型就是专门用于支持文件下载功能的。
1:配置struts-download.xml文件
1):首先要为Action配置文件中,指定结果类型type="stream".
2):需要指定一个contentDispositiom响应头参数,使下载的文件名,就是页面显示的名称。
3):指定返回inputStream的方法名称。
2:DownloadAction.java文件
1):通过set()和get()方法获取文件名
2):创建一个getInputStream()方法,该方法名称需要一致,框架会自动调用该方法来获得下载数据流。
3):在getInputStream()方法中,创建下载文件,并将该文件以文件输入流的形式,返回给调用者。
3:download.jsp文件
4:下载结果
5:代码示例
1):download.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<h3>资源下载</h3><br>
<a href="/download?filename=qq20190227103302.png">qq20190227103302</a><br>
<a href="/download?filename=MYSQL中文帮助文档.chm">MYSQL中文帮助文档</a><br>
</body>
</html>
2):struts-download.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>
<package name="downloadPkg" namespace="/" extends="struts-default">
<!-- 配置ACTION -->
<action name="download" class="org.openbox.download.DownloadAction" >
<!-- 下载结果视图要使用stream结果类型 -->
<result type="stream" name="success">
<!-- 设置文件下载参数:配置响应头,可以修改文件名 -->
<param name="contentDisposition">attachment;filename=${filename}</param>
<!-- 指定返回InputStream的方法名称,默认是:inputStream -->
<param name="inputName">inputStream</param>
</result>
<allowed-methods>execute</allowed-methods>
</action>
</package>
</struts>
3):DownloadAction.java
package org.openbox.download;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class DownloadAction extends ActionSupport{
//获得文件名称filename
private String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
//框架会调用该方法来获取下载的文件流数据,默认方法:getInputStream
public InputStream getInputStream() throws FileNotFoundException, IOException {
//获得文件下载目录
String dir=ServletActionContext.getRequest().getServletContext().getRealPath("/WEB-INF/download");
//创建一个文件
File file=new File(dir,filename);
//由文件创建一个流
FileInputStream fileInputStream=new FileInputStream(file);
//将该文件流返回给调用者
return fileInputStream;
}
@Override
public String execute() throws Exception {
return Action.SUCCESS;
}
}