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

1.1 文件的下載概述

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

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

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

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

  • 首先配置一下下載文件在項目中
放置下載資源.png
  • 編寫一個下載頁面
<body>
    <h1>超鏈接實現(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>

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

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

也需要編寫一個下載頁面跳轉Servlet

<h1>代碼方式實現(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";
        //設置兩個頭
        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);
    }

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

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


<h1>代碼方式實現(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")
        
        
        //設置兩個頭
        //設置Content-type
        String mimeType = getServletContext().g-etMimeType(fileName);
        response.setContentType(mimeType);
        //設置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>

這樣的傳入中文會導致亂碼

需要進行重新設置編碼

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 本文包括:1、文件上傳概述2、利用 Commons-fileupload 組件實現(xiàn)文件上傳3、核心API——Dis...
    廖少少閱讀 12,742評論 5 91
  • 從三月份找實習到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,761評論 11 349
  • 公主 從前的從前,有一位美麗的公主。她有一頭金色的秀發(fā),當她站在陽光下,她的頭發(fā)就會像太陽一樣耀眼;她有一雙碧綠的...
    浪跡天涯馬小泡閱讀 252評論 0 1
  • 親愛的,大千世界,無限奧秘,有太多的知識是你這一輩子無法學到的,而只能遠遠望到的。你不能想了解這個又想知道那,那樣...
    心寬則安閱讀 219評論 0 0

友情鏈接更多精彩內容