Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)
Struts2的框架提供了现成的文件下载方式,大大简化了开发下载功能的便利性。网上的例子有很多,我把一些大家普遍比较关注的点,集中一下,给出一个整体方案。
一般我们照着书本或者网上的列子写出了一个Demo,都会存在几个疑问:
1.下载文件的文件名怎么搞?不搞的话浏览器默认名字是提交的action的名字,显然不好
2.文件名里面想搞中文,但是实际上下载文件名出现了乱码或不显示中文怎么搞?
3.文件的扩展名怎么搞?比如要下载的文件是word(doc,docx)或者excel(xls,xlsx)怎么办?难道让用户自己改扩展名,太不友好了吧。
下面我们逐个说明。
场景:我们需要下载存放在服务器tomcat中webapp文件夹,对应x项目根目录下“电子表格.xlsx"文件。即tomcat\webapp\x\电子表格.xlsx文件。
并且希望用户下载的名字是“我的电子表格.xlsx”。
首先,如同Struts2框架处理其他问题一样,我们需要有一个标准的action类来对下载请求进行处理。
Action类:
Struts.xml的action配置
看完代码后的解释:
1.核心的下载功能是怎么实现的
第一,action类里面提供了InputStream流的对象is,并且在配置文件中,同Struts框架的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">application/zip</param>这样的配置。其实这就是html页面的头部标记。
我不用是因为:
我不需要呀!因为result的type设置为stream,让浏览器已经知道了是流文件,再加上contentDisposition把文件名连同连扩展名都搞定了,加上这个头参数没啥用。不信可以加上,随便设置什么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以上
- 用Struts2更好的实现文件的上传、下载功能以及解决中文名称问题
- 解决Struts2文件下载中文名称乱码以及文件名称中包含空格问题
- UITextFiled & UITextView 控制输入长度、中文处理以及UITextView 的placeHolder 的一种实现方法
- struts2文件下载,中文名称乱码
- Struts2文件上传与下载(中文名称的文件正常上传与下载)
- struts2下载中文名称的文件
- struts2中文件下载以及中文乱码
- Status2文件下载中文名称乱码处理
- struts2实现下载+登录权限验证以及中文处理乱码问题
- struts2中文件下载以及中文乱码
- Linux上配置Apache,支持中文名称文件下载的方法
- 关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、文件夹结构、设置压缩和对中文文件名称的支持、以及Catalina这个名字的由来……等)
- 使用struts2进行文件下载以及下载权限控制的例子
- Linux上配置Apache,支持中文名称文件下载的方法 ZT
- struts2文件下载之注解方式和文件不存在的处理方法
- 【Struts2】中文文件的下载与下载权限的控制
- 使用struts2进行文件下载以及下载权限控制的例子
- 【原创】将数据生成json文件下载以及json中文乱码和优化json文件格式的方法
- Linux上配置Apache,支持中文名称文件下载的方法
- struts2文件下载的时候,处理中文文件名的问题