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的更多相关文章
随机推荐
- 千万级高并发负载均衡软件HAproxy
1负载均衡产品介绍 基于硬件的负载均衡设备例如F5,Big-IP,基于软件的负载均衡产品HAproxy,LVS,nginx在这些软件产品中,又分为基于操作系统的软负载实现和基于第三方应用的软负载实现. ...
- Dubbo
启用dubbo访问日志的方法 dubbo.protocol.accesslog=true dubbo.application.logger=slf4j 然后配置logger <logger na ...
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- UVA1586
#include<stdio.h> #include<string.h> #include<ctype.h> int main(){ int n; ]; int n ...
- C 语言中 malloc、calloc、realloc 和free 函数的使用方法
C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自 ...
- C#------数字转中文
转载: http://www.jb51.net/article/8061.htm 方法二: static string ConvertToChinese(double x) { string s = ...
- UP Board 超详细开箱评测
前言 原创文章,转载引用务必注明链接. 江浙沪就是好,昨天发货今天收到.另外爱板太省了,外包装小纸箱还是6s钢化膜的重复利用. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议 ...
- 12月18日Smarty文件缓存
缓存 做缓存的目的是为了让程序运行起来更加迅速.因为如果程序访问数据库时数据量较大,执行起来会比较慢.而且每一次刷新页面都会访问依稀数据库,然后再把数据显示在页面上. 设置缓存也有一个缺点,那就是缓存 ...
- APEX初步
APEX是SFDC中用于开发的语言.语法上类似JAVA等面向对象的语言,运行起来类似数据库中的存储过程.可以在SFDC事件中添加业务逻辑,操作相关数据和用在Visual Force页面中. 保存,编译 ...
- 列表中checked全选按钮的实现
用过音乐播放器的人都知道有个全选按钮,如果使用Jquery实现,有个直接选中checked标签的方式 <!DOCTYPE HTML> <html> <head> & ...