struts2download
public class TestAction extends ActionSupport{
public String fileLoad() throws IOException{
String fileName = ServletActionContext.getRequest().getParameter("fileName");
//要处理中文乱码问题
fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
//要下载的哪个文件
String path = ServletActionContext.getServletContext().getRealPath("/");//得到项目的根目录
InputStream is = new FileInputStream(path+"/download/"+fileName);
//下载到哪里?客户端
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream os = response.getOutputStream();
//弹出下载的框filename:提示用户下载的文件名
response.addHeader("content-disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName,"utf-8"));
byte[] b = new byte[1024];
int size = is.read(b);
while(size>0){
os.write(b,0,size);
size = is.read(b);
}
is.close();
os.close();
return null;
}
}
文件下载分为两步:读文件、写文件。从服务器读取,然后写到客户端去,所以需要InputStream和OutputStream。然后设置content-disposition弹出下载提示框,提示用户下载的文件名和从何处下载的。下面一段代码是读写文件的金典代码,我也不多讲了!
byte[] b = new byte[1024];
int size = is.read(b);
while(size>0){
os.write(b,0,size);
size = is.read(b);
}
<struts>
<package name="com.action" extends="struts-default">
<action name="download" class="com.action.FileLoadAction">
<result name="success" type="stream">
<param name="contentType">application/txt;</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">2048</param>
</result>
</action>
</package>
</struts>
public class FileLoadAction extends ActionSupport{
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) throws UnsupportedEncodingException {
this.fileName = new String(fileName.getBytes("iso8859-1"),"utf-8");
}
public InputStream getDownloadFile() throws UnsupportedEncodingException, FileNotFoundException{
//attachment为进行文件保存,这个时候还可以附件另一个参数filename表示保存时的缺省名称
//inline为在线打开,不进行保存
ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
HttpServletResponse response = ServletActionContext.getResponse();
return new FileInputStream("d:/"+this.getFileName());
}
public String downloadFile(){
return SUCCESS;
}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<s:url value="download.action" var="url">
<s:param name="fileName">中文.txt</s:param>
</s:url>
<a href="${url }">点击下载</a>
action特殊的地方在于result的类型是一个流(stream),配置stream类型的结果时,因为无需指定实际的显示的物理资源,所以无需指定location属性,只需要指定inputName属性,该属性指向被下载文件的来源,对应着Action类中的某个属性,类型为InputStream,,struts2会寻找一个返回类型为InputStream的方法getInputStream()(方法名最好为getInputStream,有人说此方法名可以为别的可能需要与struts.xml中的inputName保存一致下面有解释,另一种理解:action中定义一个返回InputStream的方法,该方法作为被下载文件的入口,且需要配置stream类型结果时指定inputName参数,inputName参数的值就是方法去掉get前缀、首字母小写的字符串。
下面则列出了和下载有关的一些参数列表:
struts2download的更多相关文章
随机推荐
- Android 实时监测(监听)网络连接状态变化
http://blog.csdn.net/mxiaoyem/article/details/50708052
- 大于16MB的QSPI存放程序引起的ZYNQ重启风险
ZYNQ芯片是近两年比较流行的片子,双ARM+FPGA,在使用分立FPGA和CPU的场合很容易替代原来的分立器件. ZYNQ可以外接QSPI FLASH作为程序的存储介质. QSPI和SPI flas ...
- 定制sqlmap tamper脚本
前言 渗透测试过程中遇到注入点常常丢到sqlmap中进行测试,假如网站有waf,sqlmap便无法直接注入了. 测试 在测试某个项目的过程中,一个页面的aid参数,习惯性的提交 and 1=1发现直接 ...
- Python 【第八章】:JavaScript 、Dom、jQuery
JavaScript 放置位置 body内部最下面,这样可以避免javascript链接失效时,长时间加载不到页面html内容 变量: var a =123 局部变量 a = 123 全局变量 作用域 ...
- SUSE系统查看各种信息
系统版本 # 显示内核版本 uname -a # 可看gcc版本 cat /proc/version # 显示linux基准库 lsb_release -a # 显示Suse版本准确版本 cat /e ...
- Nginx配置性能优化
大多数的Nginx安装指南告诉你如下基础知识--通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了.而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能 ...
- web前端基础知识-(六)Django基础
上面我们已经知道Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sessi ...
- TeXstudio 编写Latex论文的若干问题
TeXstudio 编写Latex论文的若干问题解决方案总结 问题1: 如何安装TeXstudio 以及 Texstudio当中的中文字体使用问题. 一.如何安装TeXstudio 很 ...
- api签名
当你提交以上信息时,办公逸将发送GET请求到填写的URL,GET请求将携带四个参数, 参数 描述 是否必带 signature 办公逸签名,signature结合了企业填写的token,请求中的tim ...
- 浅谈Android样式开发之shape
引言 在Android开发中我们很多情况都是使用图片来展示相关效果,今天我就来详细介绍下Android下使用Shape来进行简单UI的开发.一方面这些是Android开发的基础,另一方面这方面的知识可 ...