Java語言——實現文件的下載功能

案例:實現文件的下載功能

* 文件下載需求:
  1. 頁面顯示超鏈接
  2. 點擊超鏈接後彈出下載提示框
  3. 完成圖片文件下載
* 分析:
  1. 超鏈接指向的資源如果能夠被瀏覽器解析,則在瀏覽器中展示,如果不能解析,則彈出下載提示框。不滿足需求
  2. 任何資源都必須彈出下載提示框
  3. 使用響應頭設置資源的打開方式:
    * content-disposition:attachment;filename=xxx
* 步驟:
  1. 定義頁面,編輯超鏈接href屬性,指向Servlet,傳遞資源名稱filename
  2. 定義Servlet
    1. 獲取文件名稱
    2. 使用字節輸入流加載文件進內存
    3. 指定response的響應頭: content-disposition:attachment;filename=xxx
    4. 將數據寫出到response輸出流

這兒有 源碼

package cn.itcast.web.download;

import cn.itcast.web.utils.DownLoadUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.獲取請求參數,文件名稱
        String filename = request.getParameter("filename");
        //2.使用字節輸入流加載文件進內存
        //2.1找到文件服務器路徑
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);
        //2.2用字節流關聯
        FileInputStream fis = new FileInputStream(realPath);

        //3.設置response的響應頭
        //3.1設置響應頭類型:content-type
        String mimeType = servletContext.getMimeType(filename);//獲取文件的mime類型
        response.setHeader("content-type",mimeType);
        //3.2設置響應頭打開方式:content-disposition

        //3.2.1解決中文文件名問題
        //1.獲取user-agent請求頭、
        String agent = request.getHeader("user-agent");
        //2.使用工具類方法編碼文件名即可
        filename = DownLoadUtils.getFileName(agent, filename);

        response.setHeader("content-disposition","attachment;filename="+filename);
        //4.將輸入流的數據寫出到輸出流中
        ServletOutputStream sos = response.getOutputStream();
        byte[] buff = new byte[1024 * 8];
        int len = 0;
        while((len = fis.read(buff)) != -1){
            sos.write(buff,0,len);
        }

        fis.close();


    }

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

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