Web 基礎(chǔ)25 文件下載概述及其入門案例

1.1 文件的下載概述

  • 文件下載
    • 服務(wù)器通過網(wǎng)絡(luò)以流的形式將文件發(fā)送到客戶端的過程
  • 應(yīng)用場景
    • 電影下載
    • 音樂下載
    • 安裝文件下載
  • 實(shí)現(xiàn)方式
    • 方式1
      • 可以使用超鏈接來實(shí)現(xiàn)文件的下載
      • <a href="要下載文件的地址" >下載</a>
      • 注意:如果要下載的文件類型是瀏覽器支持的類型茬高,瀏覽器會(huì)直接打開這個(gè)文件媒峡,并不會(huì)下載這個(gè)文件织狐,比如圖片
    • 方式2
      • 可以使用代碼來實(shí)現(xiàn)文件的下載
      • 需要有兩個(gè)頭和一個(gè)流
        • Content-type 設(shè)置要下載文件的類型(MIME類型)
        • Content-Disposition 通知瀏覽器呜笑,你不要關(guān)心下載文件的類型,什么類型的文件都進(jìn)行下載操作
        • 字節(jié)輸出流 response.getOutputStream()

1.2 超鏈接方式實(shí)現(xiàn)文件下載的功能

  • 好處:簡單
  • 缺點(diǎn):
    • 必須要是瀏覽器不能識(shí)別的格式,否則就會(huì)直接打開
    • 如果資源放在web-inf路徑下面,就沒法獲取

1.3 代碼方式實(shí)現(xiàn)文件下載的功能

  • 首先配置一下下載文件在項(xiàng)目中
放置下載資源.png
  • 編寫一個(gè)下載頁面
<body>
    <h1>超鏈接實(shí)現(xiàn)文件下載功能</h1>
    <a href="${pageContext.request.contextPath}/download/pic01.jpg" >pic01.jpg</a>
    <br />
    <a href="${pageContext.request.contextPath}/WEB-INF/pic01.jpg" >WEB-INF/pic01.jpg</a>
    <br />
    <a href="${pageContext.request.contextPath}/download/pic01.zip" >pic01.zip</a>
</body>

注意:瀏覽器會(huì)根據(jù)是否能解析資源來選擇是顯示還是下載的
WEB-INF的資源瀏覽器無法訪問

  • 使用代碼實(shí)現(xiàn)

也需要編寫一個(gè)下載頁面跳轉(zhuǎn)Servlet

<h1>代碼方式實(shí)現(xiàn)文件下載的功能</h1>
<a href="${pageContext.request.contextPath}/DownloadServlet" >pic01.jpg</a>

  • 編寫Servlet
package com.itbear.download;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public DownloadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //路徑
        String realPath = getServletContext().getRealPath("/download");
        //名稱
        String fileName = "pic01.jpg";
        //設(shè)置兩個(gè)頭
        String mimeType = getServletContext().getMimeType(fileName);
        response.setContentType(mimeType);
        
        response.setHeader("Content-Dispostion", "attachment;filename="+fileName);
        //IO流傳輸
        ServletOutputStream os = response.getOutputStream();
        
        FileInputStream fis = new FileInputStream(realPath+"/"+fileName);
        
        byte[] bys = new byte[1024];
        int len = 0;
        while((len = fis.read(bys)) != -1){
            os.write(bys,0,len);
        }
        
        fis.close();
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 動(dòng)態(tài)獲取代碼

URL是可以 進(jìn)行拼接 提交參數(shù)數(shù)據(jù)的


<h1>代碼方式實(shí)現(xiàn)文件下載的功能</h1>
<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.jpg" >pic01.jpg</a>
<br />
<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=pic01.zip" >pic01.zip</a>
<br />


提交path 和 fileName

  • 改寫Servelt
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //路徑
        String path = request.getParameter("path");
        String realPath = getServletContext().getRealPath("/" + path);
        //名稱
        //String fileName = "pic01.jpg";
        String fileName = request.getParameter("fileName")
        
        
        //設(shè)置兩個(gè)頭
        //設(shè)置Content-type
        String mimeType = getServletContext().g-etMimeType(fileName);
        response.setContentType(mimeType);
        //設(shè)置Content-Disposition
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
        
        //獲取輸出流
        OutputStream os = response.getOutputStream();
        //創(chuàng)建輸入流
        InputStream is = new FileInputStream(realPath + "/" + fileName);
        byte[] bys = new byte[1024];
        int len = 0;
        while((len = is.read(bys)) != -1) {
            os.write(bys,0,len);
        }
        
        is.close();
            
    }

  • 亂碼問題

<a href="${pageContext.request.contextPath}/DownloadServlet?path=download&fileName=小熊先生.jpg" >小熊先生.jpg</a>

這樣的傳入中文會(huì)導(dǎo)致亂碼

需要進(jìn)行重新設(shè)置編碼

String fileName = new String(request.getParameter("fileName").getBytes("ISO-8859-1"),"UTF-8");

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扯旷,一起剝皮案震驚了整個(gè)濱河市庙洼,隨后出現(xiàn)的幾起案子赵讯,更是在濱河造成了極大的恐慌栏赴,老刑警劉巖蘑斧,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艾帐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)米者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門伯铣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗这,“玉大人,你說我怎么就攤上這事捎稚。” “怎么了求橄?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵今野,是天一觀的道長。 經(jīng)常有香客問我罐农,道長条霜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任涵亏,我火速辦了婚禮宰睡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘气筋。我一直安慰自己拆内,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布宠默。 她就那樣靜靜地躺著麸恍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搀矫。 梳的紋絲不亂的頭發(fā)上抹沪,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天刻肄,我揣著相機(jī)與錄音,去河邊找鬼采够。 笑死肄方,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬癌。 我是一名探鬼主播权她,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逝薪!你這毒婦竟也來了隅要?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤董济,失蹤者是張志新(化名)和其女友劉穎步清,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虏肾,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廓啊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了封豪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谴轮。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吹埠,靈堂內(nèi)的尸體忽然破棺而出第步,到底是詐尸還是另有隱情,我是刑警寧澤缘琅,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布粘都,位于F島的核電站,受9級(jí)特大地震影響刷袍,放射性物質(zhì)發(fā)生泄漏翩隧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一呻纹、第九天 我趴在偏房一處隱蔽的房頂上張望鸽心。 院中可真熱鬧,春花似錦居暖、人聲如沸顽频。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽糯景。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀淮,已是汗流浹背最住。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怠惶,地道東北人涨缚。 一個(gè)月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像策治,于是被迫代替她去往敵國和親脓魏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理通惫,服務(wù)發(fā)現(xiàn)茂翔,斷路器,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 本文包括:1履腋、文件上傳概述2珊燎、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,552評論 5 91
  • 從三月份找實(shí)習(xí)到現(xiàn)在遵湖,面了一些公司悔政,掛了不少,但最終還是拿到小米延旧、百度谋国、阿里、京東垄潮、新浪烹卒、CVTE闷盔、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,255評論 11 349
  • 公主 從前的從前弯洗,有一位美麗的公主。她有一頭金色的秀發(fā)逢勾,當(dāng)她站在陽光下牡整,她的頭發(fā)就會(huì)像太陽一樣耀眼;她有一雙碧綠的...
    浪跡天涯馬小泡閱讀 225評論 0 1
  • 親愛的溺拱,大千世界逃贝,無限奧秘,有太多的知識(shí)是你這一輩子無法學(xué)到的迫摔,而只能遠(yuǎn)遠(yuǎn)望到的沐扳。你不能想了解這個(gè)又想知道那,那樣...
    仰望星空a閱讀 206評論 0 0