Struts2 文件的上传和下载
UploadOrDownAction.java为处理上传和下载请求的Action,struts.xml为Struts框架主配置文件(名称固定不能更改),uplodAndDown.xml 为配置处理上传请求和下载请求的xml配置文件。index.jsp为用户删除和下载的界面,list.jsp为显示服务器要有的可供用户下载的文件。完成编码后将项目部署到服务器上,访问http://localhost:8080/Struts203/index.jsp 即可。
项目结构如下:
需要导入的jar包:
注:jstl-1.2.jar 和 standard-1.1.2.jar为jstl表达式需要的包。log4j.jar是日志包,可以不添加。
示例代码:
1、web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>Struts203</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置过滤器 -->
<filter>
<filter-name>front</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>front</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
2、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>
<!--上传文件大小100M -->
<constant name="struts.multipart.maxSize" value="102400000"></constant>
<include file="uplodAndDown.xml"></include>
</struts>
3、uploadAndDown.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>
<package name="upload" extends="struts-default" namespace="/upload">
<action name="upload" class="cn.sz.action.UploadOrDownAction"
method="upload">
<result name="upload" type="redirect">/index.jsp</result>
</action>
<action name="list" class="cn.sz.action.UploadOrDownAction"
method="list">
<result name="list" type="redirect">/list.jsp</result>
</action>
<action name="down" class="cn.sz.action.UploadOrDownAction"
method="down">
<result name="down" type="stream">
<param name="inputName">is</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
</result>
</action>
</package>
</struts>
4、UploadOrDownAction.java
package cn.sz.action;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.http.HttpSession;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
public class UploadOrDownAction {
// 普通属性传值
// 对应上传界面的组件的name
private File upload;
// 此文件名称固定格式 :xxxFileName,xxx对应File属性名
private String uploadFileName;
private InputStream is;//读取服务器本地文件的流
private String fileName;//要下载的文件名称,和页面传过来的名称一致
//private String uploadContentType;//上传文件类型
public InputStream getIs() {
return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
}
public void setIs(InputStream is) {
this.is = is;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
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 upload() throws IOException {
// 得到的是广义值栈
// ActionContext context = ServletActionContext.getContext();
// ServletActionContext.getServletContext()得到的是application
String path = ServletActionContext.getServletContext().getRealPath("upload");
System.out.println(path);
File file = new File(path, uploadFileName);
// FileUtils用的是工具类commons.io包下的
FileUtils.copyFile(upload, file);
return "upload";
}
public String list() {
HttpSession session = ServletActionContext.getRequest().getSession();
String path = ServletActionContext.getServletContext().getRealPath("upload");
File file = new File(path);
// 获取文件夹下的所有文件名
String[] files = file.list();
if (files != null) {
session.setAttribute("files", files);
}
return "list";
}
public String down() {
// 显示调用,完成读取本地文件的功能
is = getIs();
return "down";
}
}
5、index.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>struts2 文件上传</h1>
<form action="upload/upload.action" method="post"
enctype="multipart/form-data">
<input type="file" name="upload"> <input type="submit"
value="点击上传">
</form>
<a href="upload/list.action">文件下载</a>
</body>
</html>
6、list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入jstl标签库 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!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>下载列表</h1>
<c:forEach items="${sessionScope.files }" var="file">
<p>
<a href="upload/down.action?fileName=${file }">${file }</a>
</p>
</c:forEach>
</body>
</html>
完成编码后将项目部署到服务器上,访问http://localhost:8080/Struts203/index.jsp 就看如下的界面
上传截图:
点击浏览选择上传的文件,选择之后点击上传
将看到图片已经上传到服务器指定的位置。
下载截图:
返回首页,点击下载,就可以看到可供下载的文件,点击要下载的文件就可完成下载。
补充知识点:
上传知识点:
1、界面中的file的name和action类中file属性的名一致
2、action中的文件名使用xxxFileName格式
3、实际上传采用工具类(FileUtils)
注:在struts中上传文件大小是有限制的,如果需要上传较大的文件需要设置常量struts.multipart.maxsize,单位B
下载实现思路:
1、提供一个下载列表页面,在此页面中选择下载项。
2、在下载列表页面展示文件
3、 当选择某项下载时,在action类中添加传输文件名的key的属性和InputStream流(读取服务器本地文件)
注:流的获取方式是ServletActionContext.getServletContext().getResourceAsStream("/upload/"+fileName);
4、在配置文件uploadAndDown.xml中设置
<action name="down" class="cn.sz.action.UploadOrDownAction" method="down">
<result name="down" type="stream">
<param name="inputName">is</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
</result>
</action>
result的type值设置为stream字节方式,给inputName属性注入一个值(是action类中的流的名称(属性名is))
再配置的contentDisposition是添加响应头,等价于Response.AppendHeader("Content-Disposition","attachment;filename=${fileName}");
disposition的值为attachment的作用是通知浏览器以打开或者保存的方式处理文件,${fileName}中的fileName为在action中你要下载的文件名称(即fileName属性名)