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的更多相关文章
随机推荐
- BZOJ1192 [HNOI2006]鬼谷子的钱袋
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- VS2015插件
这里记录一下,VS2015使用的插件和具体用法链接 Refactoring Essentils:代码重构分析 http://vsrefactoringessentials.com/ 可以使用 取消 R ...
- 简单的Linux的用户权限管理
企业生产环境用户权限集中管理方案案例 建立中要添加如下的项目经验: 在了解公司业务流程后,提出权限整改解决方案,改进公司超级用户Root权限泛滥的问题. 我首先写好方案后,给老大看,取得老大的支持后, ...
- 今天开始学习java编程
<java>程序设计教程与上机实验
- Think twice before doing~
1.遇到任何矛盾,对事不对人. 2.接到朋友等人的求助电话后,一定要先问清楚对方有什么事情,然后再告诉他(她)能不能帮她(他). 3.如果没有十足的把握和必要,就不要轻易说假话. 4.少提自己的私事, ...
- 一道javascript数组操作题
题目如下: var arr = ['100px','abc'-6,[],-98765,34,-2,0,'300',,function(){alert(1);}, null, document, [], ...
- Html中自定义鼠标的形状
Html中自定义鼠标的形状 <html> <head> <title>自定义的鼠标形状</title> <meta http-equiv=&quo ...
- Django基础,Day2 - 编写urls,views,models
编写views views:作为MVC中的C,接收用户的输入,调用数据库Model层和业务逻辑Model层,处理后将处理结果渲染到V层中去. polls/views.py: from django.h ...
- hibernate+mysql的连接池配置
1:连接池的必知概念 首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了. 以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放.如果频繁的 ...
- Download Excel file with Angular
源码连接(编写中) 用Angular下载后台返回的Excel文件,用Blob实现,引用FileSaver.js 后台C#代码: [WebMethod] public static byte[] Cal ...