Struts2核心jar包就包含文件上传功能。
1、文件上传时,Struts2使用拦截器对表单提交的数据自动封装
// 对应表单:<input type="file" name="file1">
private File file1;
// 文件名
private String file1FileName;
// 文件的类型(MIME)
private String file1ContentType;
public void setFile1(File file1) {
this.file1 = file1;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
}
2、文件下载时也是用拦截器获取要下载的文件名
// 1、获取下载的文件名
private String fileName;
public void setFileName(String fileName) {
// 传入参数中文处理
try{
fileName = new String(fileName.getBytes("ISO-8859-1"),"utf-8");
}catch(Exception e){
e.printStackTrace();
}
this.fileName = fileName;
}
3、文件下载时使用配置文件设置下载返回,需要action中提供一个返回文件流的方法。
<result name="download" type="stream">
<!-- 运行下载的文件为二进制类型,在tomcat配置文件中找 -->
<param name="contentType">application/octet-stream</param>
<!-- 对应action中的属性,返回文件流 -->
<param name="inputName">attrInputeStream</param>
<!-- 下载头,包括浏览器显示的文件名 -->
<param name="contentDisposition">attachment;filename=${downfilename}</param>
<!-- 缓冲区大小设置 -->
<param name="bufferSize">1024</param>
</result>
// 3、需要一个返回文件流的方法
private InputStream attrInputeStream;
public InputStream getAttrInputeStream(){
InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
return resourceAsStream;
}
完整代码
文件处理Action
public class UploadAction extends ActionSupport{
// 对应表单:<input type="file" name="file1">
private File file1;
// 文件名
private String file1FileName;
// 文件的类型(MIME)
private String file1ContentType;
public void setFile1(File file1) {
this.file1 = file1;
}
public void setFile1FileName(String file1FileName) {
this.file1FileName = file1FileName;
}
public void setFile1ContentType(String file1ContentType) {
this.file1ContentType = file1ContentType;
}
public String upload(){
try {
/*****拿到上传的文件进行处理**/
System.out.println("FileUpload.execute()");
// 获取上传的目录路径
String path = ServletActionContext.getServletContext().getRealPath("/upload");
// 创建目标文件对象
File destFile = new File(path,file1FileName);
// 把上传的文件拷贝到目标文件中
FileUtils.copyFile(file1, destFile);
return "upload";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
public String list(){
String path = ServletActionContext.getServletContext().getRealPath("/upload");
File file = new File(path);
String[] filelist = file.list();
ServletActionContext.getRequest().setAttribute("filelist", filelist);
return "list";
}
/***************文件下载**********************/
// 1、获取下载的文件名
private String fileName;
public void setFileName(String fileName) {
// 传入参数中文处理
try{
fileName = new String(fileName.getBytes("ISO-8859-1"),"utf-8");
}catch(Exception e){
e.printStackTrace();
}
this.fileName = fileName;
}
// 2、下载提交
public String down(){
return "download";
}
// 3、需要一个返回文件流的方法
private InputStream attrInputeStream;
public InputStream getAttrInputeStream(){
InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
return resourceAsStream;
}
// 4、下载显示的文件名
public String getDownfilename() throws UnsupportedEncodingException{
// 编码
fileName = URLEncoder.encode(fileName, "utf-8");
return fileName;
}
}
action配置文件struts.xml
<!-- 文件上传action(注意关键字不能用fileUpload) -->
<action name="file_*" class="com.wsk.d_upload.UploadAction" method="{1}">
<result name="upload" type="redirectAction">file_list</result>
<result name="list">/list.jsp</result>
<result name="download" type="stream">
<!-- 运行下载的文件为二进制类型,在tomcat配置文件中找 -->
<param name="contentType">application/octet-stream</param>
<!-- 对应action中的属性,返回文件流 -->
<param name="inputName">attrInputeStream</param>
<!-- 下载头,包括浏览器显示的文件名 -->
<param name="contentDisposition">attachment;filename=${downfilename}</param>
<!-- 缓冲区大小设置 -->
<param name="bufferSize">1024</param>
</result>
</action>
列表展示list.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'list.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>
<body>
<table border="1" align="center">
<tr>
<th>序号</th>
<th>文件名</th>
<th>操作</th>
</tr>
<c:forEach var="e" items="${requestScope.filelist }" varStatus="vs">
<tr>
<td>${vs.count }</td>
<td>${e }</td>
<td><a href="${pageContext.request.contextPath }/file_down?fileName=${e}">下载</a></td>
</tr>
</c:forEach>
<tr><td colspan="3" align="center"><a href="${pageContext.request.contextPath }/upload.jsp">上传</a></td></tr>
</table>
</body>
</html>
文件上传提交页面
<form action="${pageContext.request.contextPath }/file_upload" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="userName"><br/>
文件:<input type="file" name="file1"><br/>
<input type="submit" value="上传">
</form>