Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)

Struts2的框架提供了现成的文件下载方式,大大简化的问价下载的使用便利性。网上的列子有很多,我把一些大家普遍比较关注的点,集中一下,给出一个整体方案。

一般我们照着书本或者网上的列子写出了一个Demo,都会存在几个疑问:

1.下载文件的文件名怎么搞?不搞的话浏览器默认名字是提交的action的名字

2.文件名里面想搞中文,但是实际上下载文件名出现了乱码或不显示中文怎么搞?

3.文件的扩展名怎么搞?比如要下载的文件是word(doc,docx)或者excel(xls,xlsx)怎么办?难道让用户自己改扩展名,太不友好了吧。

下面我们逐个说明。

场景:我们需要下载存放在服务器tomcat中webapp文件夹,对应x项目下根目录下“电子表格.xlsx"文件。即tomcat\webapp\x\电子表格.xlsx文件。

并且用户下载的名字是“我的电子表格.xlsx”。

首先,如同Strut2框架处理其他问题一样,我们需要有一个标准的action类来对下载请求进行处理。

Action类:

  

Struts.xml的action配置

JSP:

看完代码后的解释:

1.核心的下载功能是怎么实现的

 第一,action类里面提供了InputStream流的对象is,并且在配置文件中,同inputName进行了绑定。Strut2利用Servlet本来就有的标准流服务提供给客户端的浏览器提供下载。

  关键配置:

  result的type不再是一般的"dispatcher",而是"stream",表明返回给客户端的是流对象。一个名字为"inputName"的param参数表示,你得告诉框架,

action类里面哪个参数是要提供下载的InputStream对象。我们这里就是is

关键代码:

  InputStream对象 is,并且必须有对应的get方法,不然框架拿不到这个对象。注意大小写

    

      

  为is对象赋值,得到真正文件的流对象。

    

 2.名字怎么搞?

 这种姿势搞(顺便把扩展名和中午字符一并搞了):

关键配置:

  attachment标示告诉浏览器是附件,不要打开(有时候下载的文件是txt之类的有些浏览器默认自动打开,而不是下载)。

 filename=&{fileName},指定要下载的文件是什么名字。${fileName}这个通配符加大括号表示,文件的名字不是fileName,而是在

 action类中一个名字叫fileName的参数的值

关键编码:

  

由于浏览器在只能识别用ISO8859-1编码的UTF-8的字符串,所以我们需要在代码中把中文的文件名用ISO8859-1再重新编码一下。这样就解决了中文问题。

 扩展名怎么解决?看上面的图,xlsx扩展名一并同文件名统一处理。下载的文件自然就带这个扩展名了。

以上,文章开头的三个问题得到解决。

至于buffersize就不解释了,所有的流传递肯定都有缓冲的概念。

有人可能会问,为什么action的配置中,param参数了吗没有<param name="contentType"></param>。其实这就是html页面的头部标记。

我不用试因为

我不需要呀!因为浏览器已经知道了是流文件,并且连扩展名都有了,这个头没啥用。不信可以加上,随便设置什么MIME的头标记,都不起作用了。

当然,如果每次下载的都是固定名字,配置文件也可以这样:

这串文字代表MIME协议(多用途的网际邮件扩充协议;)里面的xlsx格式。

下面附上MIME常用的数据类型对应关系:

.doc     application/msword

.docx   application/vnd.openxmlformats-officedocument.wordprocessingml.document

.rtf       application/rtf

.xls     application/vnd.ms-excel application/x-excel

.xlsx    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

.ppt     application/vnd.ms-powerpoint

.pptx    application/vnd.openxmlformats-officedocument.presentationml.presentation

.pps     application/vnd.ms-powerpoint

.ppsx   application/vnd.openxmlformats-officedocument.presentationml.slideshow

.pdf     application/pdf

.swf    application/x-shockwave-flash

.dll      application/x-msdownload

.exe    application/octet-stream

.msi    application/octet-stream

.chm    application/octet-stream

.cab    application/octet-stream

.ocx    application/octet-stream

.rar     application/octet-stream

.tar     application/x-tar

.tgz    application/x-compressed

.zip    application/x-zip-compressed

.z       application/x-compress

.wav   audio/wav

.wma   audio/x-ms-wma

.wmv   video/x-ms-wmv

.mp3 .mp2 .mpe .mpeg .mpg     audio/mpeg

.rm     application/vnd.rn-realmedia

.mid .midi .rmi     audio/mid

.bmp     image/bmp

.gif     image/gif

.png    image/png

.tif .tiff    image/tiff

.jpe .jpeg .jpg     image/jpeg

.txt      text/plain

.xml     text/xml

.html     text/html

.css      text/css

.js        text/javascript

.mht .mhtml   message/rfc822

 

 

时间: 05-14

Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)的相关文章

【技术宅3】截取文件和url扩展名的N种方法

//截取文件扩展名的N种方法   //第1种 //strrchr() 函数查找字符在指定字符串中最后一次出现的位置,如果成功,则返回其后面的字符串 //返回带有点的扩展名 function get_extension($file){ return strrchr($file, '.'); } echo get_extension("d.sdf.jpeg"); //第2种 //strchr() 函数查找字符在指定字符串中第一次出现的位置,如果成功,则返回其后面的字符串 //利用回调函数反

HTTP下载文件名称编码说明

HTTP下载保存文件名 下载文件需要保存的名称 在响应报文头中 Content-Disposition 响应报文头域中指定, 例如 Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" 其中filename后指定文件名称. HTTP规范要求 http://www.w3.org/Protocols/rfc2616/rfc2616-sec

winform通过FTP协议上传下载文件

上传文件:窗体代码 一次上传多个文件(grdAffixFilesList中需要上传的) private Boolean UploadFile() { string filename; int upCount=0; for (int i = 0; i < this.grdAffixFilesList.Rows.Count; i++) { filename = this.grdAffixFilesList.Rows[i].Cells["FILEPATH"].Text.ToString

struts2文件下载相关信息

struts.xml文件配置: [html] view plaincopy <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" &q

struts2文件下载及 &lt;param name="inputName"&gt;inputStream&lt;/param&gt;的理解

struts.xml文件配置: [html] view plaincopy <span style="font-size:16px;"><?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" &q

Struts2 文件下载

1 package lee; 2 3 import java.io.InputStream; 4 import org.apache.struts2.ServletActionContext; 5 import com.opensymphony.xwork2.Action; 6 import com.opensymphony.xwork2.ActionContext; 7 import java.util.Map; 8 /** 9 * Description: 10 * <br/>网站: &l

Struts2学习第三天——拦截器与文件传输

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.15 lutianfei none 内容摘要: 1.国际化(了解) 2.拦截器(Interceptor)-重点 3.struts2文件上传与下载(次重点) 4.ognl与valuestack 国际化 国际化原理,什么是国际化 ? 同一款软件 可以为不同用户,提供不同语言界面 -- 国际化软件 需要一个语言资源包(很多properties文件,每个properties文件 针对一个国家或者语言 ,通过java程序根

安卓使用WebView下载文件,安卓实现软件升级功能

因为调用系统默认浏览器下载更新,造成用户体验很不好,所以决定在webview中直接下载系统更新,然后直接安装. 因为要下载,所以必须用webview,联网权限这里不说了,直接写在manifafest中. 我们常用的下载都是调用Android默认浏览器 这样写 1.设置WebView的DownloadListener: webView.setDownloadListener(new MyWebViewDownLoadListener()); 2.实现MyWebViewDownLoadListene

【331】python 下载文件:wget / urllib

参考:python下载文件的三种方法(去掉-) 方法一:wget import wget, os # 设置下载路径 os.chdir(r"D:/tmp") url="https://files.cnblogs.com/files/alex-bn-lee/ESRI_01.zip" # 获取下载文件名称 filename = wget.detect_filename(url) # 文件下载 wget.download(url) 方法二:urllib import url