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 文件下载(中文处理方法以及控制下载文件名称和扩展名)的更多相关文章

  1. 由于想要实现下载的文件可以进行选择,而不是通过<a>标签写死下载文件的参数,所以一直想要使用JFinal结合ajax实现文件下载,但是ajax实现的文件下载并不能触发浏览器的下载文件弹出框,这里通过模拟表单提交实现同样的效果。

    由于想要实现下载的文件可以进行选择,而不是通过<a>标签写死下载文件的参数,所以一直想要使用JFinal结合ajax实现文件下载(这样的话ajax可以传递不同的参数),但是ajax实现的文 ...

  2. 【Azure 应用服务】App Service站点Header头中的中文信息显示乱码?当下载文件时,文件名也是乱码?

    问题描述 在本地开发的站点,响应头中的中文可以正常显示,部署到Azure App Service站点后,响应中文乱码.通过多方面验证,在代码中设置Response的Headers会显示乱码,而直接配置 ...

  3. HTTP下载文件名称编码说明

    HTTP下载保存文件名 下载文件需要保存的名称 在响应报文头中 Content-Disposition 响应报文头域中指定, 例如 Content-Disposition: attachment; f ...

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

    //截取文件扩展名的N种方法   //第1种 //strrchr() 函数查找字符在指定字符串中最后一次出现的位置,如果成功,则返回其后面的字符串 //返回带有点的扩展名 function get_e ...

  5. java 获取某个URL的文件扩展名的方法(非精确,精确的扩展名应该使用服务器返回的MIME-TYPE)

    public static String getFileExtension(URL extUrl) { //URL: "http://photosaaaaa.net/photos-ak-sn ...

  6. Delphi获取文件名、文件名不带扩展名、文件名的方法;delphi 获取文件所在路径

    取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一:   Function Extrac ...

  7. Delphi获取文件名、不带扩展名文件名、文件所在路径、上级文件夹路径的方法

    1.获取不带扩展名的文件名方法,利用ChangeFileExt函数修改传入参数的扩展为空,并不会对文件本身产生变更. ChangeFileExt(ExtractFileName('D:\KK\Test ...

  8. struts2文件下载及 <param name="inputName">inputStream</param>的理解

    转自:http://blog.csdn.net/wnczwl369/article/details/7483290 转自:http://hi.baidu.com/c2_sun/item/934a542 ...

  9. struts2文件下载相关信息

    struts.xml文件配置: <span style="font-size:16px;"><?xml version="1.0" encod ...

随机推荐

  1. 既生list何生tuple

    python中list是可以修改的;若要创建一系列不可修改的元素时,就需要tuple. 用 tuple 的好处: 1.tuple 比 list 操作速度快.如果您定义了一个值的常量集,并且唯一要用它做 ...

  2. gradle build scan

    1:gradle build scan 用于视图审查 构建步骤如下  https://guides.gradle.org/creating-build-scans/?_ga=2.80362963.59 ...

  3. logstash采集tomcat日志、mysql错误日志

    input{ file { path => "/opt/Tomcat7.0.28/logs/*.txt" start_position => "beginni ...

  4. Django 连接redis方法

    1. 按照redis模块 # 在cmd中 pip3 install redis 2. 测试代码 插入单挑数据 import redis conn = redis.Redis(host='10.0.0. ...

  5. SQL备份数据库代码

    SQL备份数据库代码 #region 服务每天备份一次数据库 /// <summary> /// 服务每天备份一次数据库 /// </summary> public void ...

  6. spring-data-mongodb关于id的坑

    有如下Mongo记录: 在Java中对应2个类来表示此结构: public class SG_IMAGERELATION { @Id private String id; private int gi ...

  7. VueJS 数据驱动和依赖追踪分析

    之前关于 Vue 数据绑定原理的一点分析,最近需要回顾,就顺便发到随笔上了 在之前实现一个自己的Mvvm中,用 setter 来观测model,将界面上所有的 viewModel 绑定到 model ...

  8. Trove系列(六)——Trove的安全组功能和Trove的卷数据快照功能介绍

    Trove的安全组功能功能描述用户目前没有办法在Trove guest 实例上配置安全组 和 安全组规则. 我们建议按照以下指导原则创建一个简单的安全组操作规则.本功能作为Trove 的附加功能实现( ...

  9. zw版【转发·台湾nvp系列Delphi例程】HALCON Roberts1

    zw版[转发·台湾nvp系列Delphi例程]HALCON Roberts1 procedure TForm1.Button1Click(Sender: TObject);var img, img1: ...

  10. cf 459E

    cf459E 这题说的是 给定一个n点m条边的带边权的有向图,从中找出一条路径(可以带环),该路径包含的边数最多,并且要求路径中的权值必须严格递增,然后对边进行排序完个后采用dp去解特殊判断一下边权值 ...