zoukankan      html  css  js  c++  java
  • Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)

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

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

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

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

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

    下面我们逐个说明。

    场景:我们需要下载存放在服务器tomcat中webapp文件夹,对应x项目根目录下“电子表格.xlsx"文件。即tomcatwebappx电子表格.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

    以上

     

  • 相关阅读:
    suse linux编译安装GCC报错
    suse linux 编译安装Apache时报“APR NOT FOUND”的解决方法
    LoadRunner监控Windows和Linux常见问题
    LR报-27727错误解决办法
    主机在virtualbox在NAT方式SSH访问
    清除hao123浏览器劫持小尾巴病毒
    在CentOS上,Servlet出现java.lang.NoClassDefFoundError
    构建第一个SSH的maven项目
    关于Oracle数据库sys用户登入的解惑
    ip route-static 命令的参数
  • 原文地址:https://www.cnblogs.com/wangxiaoha/p/6861513.html
Copyright © 2011-2022 走看看