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的更多相关文章
随机推荐
- EntityFramework之监听者判断SQL性能指标
前言 当我们利用EF这个ORM框架时,我们可能会利用LINQ或者原生的SQL语句来进行数据操作,此时我们无法确定我们的代码是否会给数据库带来一定的负载,当给数据库带来一定的压力时,由于项目中对数据进行 ...
- jquery网页可见区域宽
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- asp.net webservice返回json问题
使用jQuery $.ajax方法请求webservice 一.方法返回值为string,将json格式的字符串返回 设置contentType为"application/json;char ...
- PHP 之道
http://wulijun.github.io/php-the-right-way/
- C#面向对象设计模式纵横谈——2.Singleton 单件(创建型模式)
一:模式分类 从目的来看: 创建型(Creational)模式:负责对象创建. 结构型(Structural)模式:处理类与对象间的组合. 行为型(Behavioral)模式:类与对象交互中的职责分配 ...
- React Diff算法
Web界面由DOM树来构成,当其中某一部分发生变化时,其实就是对应的某个DOM节点发生了变化.在React中,构建UI界面的思路是由当前状态决定界面.前后两个状态就对应两套界面,然后由React来比较 ...
- HTML5 Drop API
转自:http://www.cnblogs.com/fsjohnhuang/p/3961066.html 一.前言 在HTML4的时代,各前端工程师为了实现拖拽功能可说是煞费苦心,初听HTML5 ...
- ORA-01438: 值大于为此列指定的允许精度
Number的数据声明如下:表示 作用 说明Number(p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点 ...
- 数字与字母混合生成流水号规则--ASP实现
最近遇到一个比较奇葩的事情,自己所负责的一个系统出现一个流水号用完的问题:正常情况下,流水号用完应该增加多位来解决这个问题.鉴于各种因素,最后决定:位数不变,增加字母进去,当数字用完后,会出现字母,而 ...
- [转] Windows下编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...