Servlet-HttpServletResponse實現下載文件

要實現文件的下載,我們很清楚就會想到HttpServletResponse類向客戶端寫數據的方法,該類沒有向外寫數據的方法,於是我們找到其父類ServletResponse,父類中有如下兩個方法:

//文件流
public ServletOutputStream getOutputStream() throws IOException;
//字符流
public PrintWriter getWriter() throws IOException;

兩者的區別就是,前者是以二進制數據流傳遞,後者是字符流傳遞,前者可用來處理各類文件,而後者處理非文本文件時就可能會出現問題。

實現下載文件,無疑就是想客戶端寫回文件數據流,一般就採用getOutputStream()方法,向客戶端寫回數據。

具體步驟如下:

  1. 獲取下載文件的路徑
  2. 下載的文件名
  3. 讓瀏覽器支持下載的功能
  4. 創建下載文件的輸入流
  5. 創建緩衝區
  6. 獲取輸出流對象
  7. 將文件流寫入緩衝區,輸出流對象將緩衝區中的數據再寫入客戶端
  8. 關閉流對象

具體編碼如下:

package cn.ara.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class FileDownLoadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1. 獲取下載文件的路徑
        String realPath = this.getServletContext().getRealPath("WEB-INF\\classes\\比心.gif");

        //2. 下載的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

        //3. 讓瀏覽器支持下載的功能
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));

        //4. 創建下載文件的輸入流
        FileInputStream fileInputStream = new FileInputStream(realPath);

        //5. 創建緩衝區
        int len = 0;
        byte[] buffer = new byte[1024];

        //6. 獲取輸出流對象
        ServletOutputStream outputStream = response.getOutputStream();

        //7. 將文件流寫入緩衝區,輸出流對象將緩衝區中的數據再寫入客戶端。
        while ((len = fileInputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, len);
        }

        //8.關閉流對象
        outputStream.close();
        fileInputStream.close();


    }

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

文件所在路徑:
在這裏插入圖片描述

在web.xml文件中添加:

<servlet>
  <servlet-name>FileDownLoadServlet</servlet-name>
  <servlet-class>cn.ara.servlet.FileDownLoadServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>FileDownLoadServlet</servlet-name>
  <url-pattern>/fileDownLoad</url-pattern>
</servlet-mapping>

然後開啓服務器,在瀏覽器中訪問該路徑,就會出現下載文件的提示:

在這裏插入圖片描述
到此,就實現了簡單的文件下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章