struts2使用action方式实现文件下载(支持中文文件名)

  • 【1】支持中文名称文件(源文件中文名称、下载另存为为中文名称)
  • 【2】加入session判断,还可进行权限控制

action类:

package com.fsti.ssh.action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

/**
 * 文件下载 【1】支持中文文件名称 【2】加入session判断,还可进行权限控制
 * 
 * @author deniro
 */
public class FileDownloadAction extends AuthorityAction {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	static Logger log = Logger.getLogger(FileDownloadAction.class);
	
	/**
	 * 被下载的资源路径
	 */
	private String inputPath;

	public void setInputPath(String inputPath) {
		this.inputPath = inputPath;
	}

	/**
	 * 文件名
	 */
	private String fileName;
	
	

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	/**
	 * 获取下载显示的文件名称
	 * 
	 * @return
	 */
	public String getDownloadFileName() {
		String downFileName = fileName;
		try {
			downFileName = new String(downFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			log.error("获取下载显示的文件名称",e);
		}
		return downFileName;
	}

	/**
	 * 配置stream类型结果时,需指定inputName;inputName为方法名去掉get前缀,并且首字母小写的字符串;
	 * 比如此例中的inputName为 targetFile
	 * 
	 * @return
	 */
	public InputStream getTargetFile() {
		InputStream resourceAsStream = ServletActionContext.getServletContext().getResourceAsStream(
				inputPath);
		log.info("resourceAsStream:"+resourceAsStream);//若为NULL,则说明未取到文件,请确认文件路径是否正确。
		return resourceAsStream;
	}
}


struts配置文件:

<!-- 指定struts2 DTD信息 -->
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">

<struts>
	
	<package name="download" extends="struts-default">
		<action name="download" class="com.fsti.ssh.action.FileDownloadAction">
			<!-- 被下载的资源路径 -->
			<param name="inputPath">\WEB-INF\download\灯塔.jpg</param>
			<!-- 下载显示的文件名称 -->
			<param name="fileName">灯塔.jpg</param>
			<result name="success" type="stream">
			 	<!-- 指定下载文件的文件类型 -->
				<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
				<!-- 指定stream方法名称 -->
				<param name="inputName">targetFile</param>
				<!-- 文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,默认为直接显示文件 -->
				<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
				<!-- 指定下载文件的缓冲大小 -->				
				<param name="bufferSize">4096</param>
			</result>
		</action>
	</package>
	
</struts>

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>

	<p><span><a href="download.action" target="_blank">下载</a></span></p>
	<div class="divider"></div>
	<ul>
		<li>【1】支持中文名称文件(源文件中文名称、下载另存为为中文名称)</li>
		<li>【2】加入session判断,还可进行权限控制</li>
	</ul>
</body>
</html>


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值