Struts2 文件的上传和下载

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属性名)

     



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值