Struts2 文件的上传和下载

来源:互联网 发布:isight8.0软件下载 编辑:程序博客网 时间:2024/05/16 10:17

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 {// 普通属性传值// 对应上传界面的组件的nameprivate 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()得到的是applicationString 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属性名)