Struts2的框架提供了現成的文件下載方式,大大簡化了開發下載功能的便利性。網上的例子有不少,我把一些你們廣泛比較關注的點,集中一下,給出一個總體方案。javascript
通常咱們照着書本或者網上的列子寫出了一個Demo,都會存在幾個疑問:css
1.下載文件的文件名怎麼搞?不搞的話瀏覽器默認名字是提交的action的名字,顯然很差html
2.文件名裏面想搞中文,可是實際上下載文件名出現了亂碼或不顯示中文怎麼搞?java
3.文件的擴展名怎麼搞?好比要下載的文件是word(doc,docx)或者excel(xls,xlsx)怎麼辦?難道讓用戶本身改擴展名,太不友好了吧。web
下面咱們逐個說明。瀏覽器
場景:咱們須要下載存放在服務器tomcat中webapp文件夾,對應x項目根目錄下「電子表格.xlsx"文件。即tomcat\webapp\x\電子表格.xlsx文件。tomcat
而且但願用戶下載的名字是「個人電子表格.xlsx」。服務器
首先,如同Struts2框架處理其餘問題同樣,咱們須要有一個標準的action類來對下載請求進行處理。app
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
以上