亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于Struts2的文件下載

2019-11-14 20:58:31
字體:
來源:轉載
供稿:網友
關于Struts2的文件下載

首先先來說下關于文件下載的原理:

服務端為客戶端提供了一個下載服務,所以服務端需要一個輸出流(把客戶請求下載的文件輸出),相對于服務端來說,客戶端需要下載接收一個文件,所以它需要一個輸入流(接收文件)。

服務器讀取要下載文件的內容,用一個Response響應流寫回并設置HTTP頭信息ContentType(文件類型)、ContentDisposition(以什么方式打開)

下面給出一個小Demo,具體代碼具體分析吧

1、首先是提供下載的頁面:download.jsp

給出超鏈接到Action并用Get方式傳遞一個文件名進行屬性注入

 1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 6 <title>下載文件示例</title> 7 </head> 8 <body> 9 <h2>下載文件</h2>10 <a href="download.action?filename=照片文件.jpg">點擊下載照片文件</a>11 <a href="download.action?filename=admin.rar">點擊下載壓縮包文件</a>12 <a href="download.action?filename=總結.txt">點擊下載文本文件</a>13 </body>14 </html>

2、處理下載文件的Action:DowloadAction.java

這里提供了一個成員變量屬性來接收頁面傳遞過來的文件名,由于文件名是以Get方式傳遞過來的,中文會出現亂碼問題,所以在setter方法里需要做一些處理,也就是重新編碼。

 1 package com.lcw.struts2.dowload; 2  3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileNotFoundException; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.io.UnsupportedEncodingException; 9 import java.net.URLEncoder;10 11 import org.apache.struts2.ServletActionContext;12 13 import sun.misc.BASE64Encoder;14 15 import com.opensymphony.xwork2.ActionSupport;16 /**17  * 對于客戶端來說它需要下載接收一個文件,也就是說它需要一個輸入流18  * 對于服務端來說它需要對外提供一個下載的服務,也就是說它需要一個輸出流19  */20 21 public class DowloadAction extends ActionSupport {22 23     PRivate String filename;//下載頁面傳遞了該參數,需提供setter方法接收24 25     public void setFilename(String filename) {26         //由于是get方式傳遞的,中文會出現亂碼,不能直接獲取,需轉碼27         try {28             this.filename = new String(filename.getBytes("ISO-8859-1"),"utf-8");29         } catch (UnsupportedEncodingException e) {30             e.printStackTrace();31         }32     }33     34     public String execute(){35         System.out.println("正在下載文件:"+filename);36         return SUCCESS;37     }38     39     //為客戶端提供輸入流40     public InputStream getInputStream() throws FileNotFoundException{41         String srcFile=ServletActionContext.getServletContext().getRealPath("/download")+"/"+filename;42         File file=new File(srcFile);//得到一個file對象43         return new FileInputStream(file);//返回一個文件輸入流44     }45     46     //根據不同的文件動態給出MIME文件類型47     public String getContentType(){48         //在Tomcat Conf里的web.xml有對應的映射文件49         return ServletActionContext.getServletContext().getMimeType(filename);50     }51     52     //返回一個文件名53     public String getFilename() throws IOException{54         String agent=ServletActionContext.getRequest().getHeader("user-agent");//根據http頭信息獲取對應的瀏覽器類型55         return encodeDownloadFilename(filename,agent);56     }57     58     59     //下載附件名亂碼問題 , IE和火狐 解決不同   IE默認是Url編碼 火狐默認是base64編碼60     public String encodeDownloadFilename(String filename, String agent)61             throws IOException {62         if (agent.contains("Firefox")) { // 火狐瀏覽器63             filename = "=?UTF-8?B?"64                     + new BASE64Encoder().encode(filename.getBytes("utf-8"))65                     + "?=";66         } else { // IE及其他瀏覽器67             filename = URLEncoder.encode(filename, "utf-8");68         }69         return filename;70     }71 }

看了上面的代碼,如果不清楚這塊知識點的朋友可能會有點蒙,別急,下面我來解析下這段代碼是怎么來的

首先Struts2的文件下載是通過一個結果集stream來完成的,在Struts2核心包里的struts-default.xml里我們可以找到這樣的一句話:

<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>

我們來看下這個類(org.apache.struts2.dispatcher.StreamResult)里面有什么,Ctrl+Shift+T關聯下源代碼

這個類里面給出了很多參數,因為都有默認值,所以我們不需要全部到去改動它,只需要改變我們需要的地方就可以了。

這里來解釋下上面畫紅色框的參數內容:contentType,contentDisposition,inputName

contetType:是下載文件對應的MIME協議類型,比如:text/html,text/plain等,這個參數我們不能寫死,因為我們的下載文件的類型有很多,有時是圖片,有時是文檔等。

contentDisposition:是下載文件的打開方式,這里默認是inline也就是內聯在瀏覽器打開,如果不想關聯瀏覽器我們可以把它設置成attment以附件的形式打開。

inputNmae:這是定義一個返回流(客戶端需要的輸入流)的名稱,屬性值為inputStream。

所以我們需要在Action里面提供這些東西,利用JAVA的反射機制讓Struts2的配置文件(壓入值棧,并給出getter方法)讀取到就行了。

這里我們的下載附件名依舊會亂碼,因為IE等瀏覽器默認的編碼是URL而火狐瀏覽器默認的編碼是BASE64,我們需要在這里判斷客戶端使用的是什么瀏覽器,這個很簡單,只需要得到客戶端的HTTP頭信息Agment就行了,具體代碼在上面encodeDownloadFilename方法里以給出,拿來用便是了。

3、再來看下配置文件struts.xml的配置:

由于Action里已給出我們所需參數的getter方法,我們在這邊這需要用Ognl表達式取出,就可以根據我們要下載的文件,動態給出所需參數了,沒有設置的參數就意味著保持默認值。

 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 4     "http://struts.apache.org/dtds/struts-2.0.dtd"> 5 <struts> 6     <constant name="struts.devMode" value="true" /> 7      8     <!-- 全局國際化配置 --> 9     <constant name="struts.custom.i18n.resources" value="messages"></constant>10 11     <package name="struts2test" extends="struts-default">12         <action name="download" class="com.lcw.struts2.dowload.DowloadAction">13             <result type="stream">14                 <!-- 一個流二個頭 -->15                 <!-- ognl表達式,動態給出不同下載文件相相對應的MIME協議規定的類型 比如:text/html-->16                 <!-- 在Action里給出getContentType壓棧 -->17                     <param name="contentType">${contentType}</param>18                 <!-- 下載文件打開方式 inline瀏覽器內部打開, attachment 以附件形式打開 -->19                 <!-- 在Action里動態返回文件名 getFilename -->20                     <param name="contentDisposition">attachment;filename=${filename}</param>21             </result>22         </action>23     </package>24 25 </struts>

然后我們新建一個文件夾download,把要下載的文件和web頁面提供的文件名一樣放入

到這里就大功告成了,看下頁面效果吧:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品视频9999| 91国语精品自产拍在线观看性色| 成人免费在线视频网站| 欧美性高潮在线| 亚洲视频一区二区| 欧美黄色片在线观看| 欧美大人香蕉在线| 久久精品国产亚洲7777| 日韩经典中文字幕在线观看| 亚洲一区二区自拍| 日日狠狠久久偷偷四色综合免费| 亚洲xxxx在线| 国精产品一区一区三区有限在线| 亚洲一区亚洲二区亚洲三区| 亚洲va欧美va国产综合剧情| 欧美在线观看视频| 国产精品久久色| 九九精品视频在线| 亚洲毛片在线观看| 欧美成在线视频| 亚洲aaaaaa| 欧美成人久久久| 日韩欧美国产中文字幕| 国产精品 欧美在线| 久久精品亚洲热| 国产精品极品美女在线观看免费| 亚洲人成网站色ww在线| 亚洲美女性生活视频| 国产精品久久久久久五月尺| 欧美另类高清videos| 色婷婷综合久久久久中文字幕1| 欧美成人免费小视频| 一区二区三区精品99久久| 亚洲人成电影网站色www| 成人精品一区二区三区| 精品国产鲁一鲁一区二区张丽| 亚洲欧美国产一本综合首页| 国产va免费精品高清在线观看| 91久久精品国产91久久| 欧美丝袜第一区| 亚洲国产高潮在线观看| 亚洲欧美综合精品久久成人| 国产一区私人高清影院| 欧美xxxx14xxxxx性爽| 国产欧美日韩精品丝袜高跟鞋| 国产精品精品久久久久久| 成人国内精品久久久久一区| 国产精品海角社区在线观看| 欧美激情区在线播放| 91九色国产视频| 在线播放日韩专区| 久久人体大胆视频| 高清视频欧美一级| 国产精品日本精品| 欧美国产第二页| 国外色69视频在线观看| 日韩免费黄色av| 色综合久久天天综线观看| 精品久久香蕉国产线看观看亚洲| 欧美激情视频一区二区三区不卡| 亚洲国产精品久久久久秋霞不卡| 欧美日韩国产色视频| 久久久女女女女999久久| 中文字幕精品一区二区精品| 久久久久久成人| 91高清免费视频| xvideos成人免费中文版| 亚洲国产另类久久精品| 亚洲老头老太hd| 亚洲成人久久久| 在线视频免费一区二区| 日韩毛片中文字幕| 68精品国产免费久久久久久婷婷| 色午夜这里只有精品| 亚洲成人黄色在线| 久久综合网hezyo| 欧美日韩免费看| 欧美日韩在线视频一区二区| 欧美刺激性大交免费视频| 一本色道久久88亚洲综合88| 中文字幕亚洲自拍| 91最新国产视频| 日韩美女在线观看一区| 成人h视频在线观看播放| 国内精品久久久久久| 久久久久久网址| 久久精品视频在线播放| 美女视频黄免费的亚洲男人天堂| 久久天天躁狠狠躁老女人| 2021久久精品国产99国产精品| 中文字幕日韩欧美| 亚洲精品久久视频| 亚洲国产成人精品久久久国产成人一区| 亚洲人成电影网站色…| 亚洲无限乱码一二三四麻| 午夜精品久久久久久久久久久久| 国产成人拍精品视频午夜网站| 狠狠躁夜夜躁人人爽天天天天97| 91沈先生在线观看| 7777kkkk成人观看| 亚洲xxxxx性| 国产精品视频色| 国产日韩欧美视频| 日韩在线观看免费| 精品久久久久久亚洲国产300| 国产精品福利网站| 国产精品电影观看| 91网站在线看| 性欧美激情精品| 国产精品精品视频一区二区三区| 中文字幕久久久| 国产精品6699| 国产精品久久久久久久久粉嫩av| 91在线免费观看网站| 国产精品网站视频| 91国产一区在线| 91亚洲精品在线| 久久九九免费视频| 国产精品高精视频免费| 啊v视频在线一区二区三区| 日韩欧美国产激情| 亚洲天堂免费视频| 久久久亚洲国产天美传媒修理工| 欧美黑人性生活视频| 久久精品精品电影网| 久久久综合免费视频| 欧美激情在线观看| 亚洲影视中文字幕| 日韩高清不卡av| 91精品久久久久久久久久另类| 国产精品永久免费| 欧洲中文字幕国产精品| 亚洲国产精品久久91精品| 午夜精品一区二区三区在线视| 色狠狠久久aa北条麻妃| 伊人一区二区三区久久精品| 尤物九九久久国产精品的分类| 久久精品中文字幕一区| 亚洲网站在线播放| 九九久久综合网站| 色噜噜狠狠色综合网图区| 欧美激情综合亚洲一二区| 91在线观看免费高清| 国产精品综合不卡av| 国产婷婷97碰碰久久人人蜜臀| 欧美一级bbbbb性bbbb喷潮片| 久久91亚洲人成电影网站| 亚洲天堂网站在线观看视频| 日韩在线观看视频免费| 国产精品欧美日韩一区二区| 欧美插天视频在线播放| 在线观看日韩视频| 自拍偷拍亚洲精品| 日韩欧美有码在线| 日韩毛片中文字幕| 欧美性猛交xxxx乱大交蜜桃| 日本不卡视频在线播放| 久久久av亚洲男天堂| 欧美高清第一页| 91在线免费看网站| 国产成人精品在线视频| 国产精品18久久久久久首页狼| 久久精品中文字幕免费mv| 久久精品中文字幕一区|