1. 程式人生 > >Web中如何應用檔案下載

Web中如何應用檔案下載

1.為什麼有些檔案可以下載 而有些檔案不能下載

在瀏覽器中有的瀏覽器可以自己解析 即可以下載 但有一些瀏覽器自己解析不了 就需要下載

2.什麼情況下需要在伺服器端編寫檔案下載的程式碼

瀏覽器可以解析的程式碼需要編寫檔案下載的程式碼

3.檔案下載的實質

實質就是檔案拷貝,將檔案從伺服器拷貝到瀏覽器端 檔案下載需要IO技術將伺服器端的檔案使用InputStream讀取 再使用 ServletOutputStream寫到response緩衝區中

4.使用伺服器端編碼的方式實現檔案下載

與之前的上傳圖片下載 只多了設定兩個檔案下載的頭 但是當檔案是中文的時候 會亂碼

public class DownloadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //獲取請求中filename名字
        String filename = request.getParameter("filename");
        //設定兩個檔案下載的頭
        response.setContentType(this
.getServletContext().getMimeType(filename)); response.setHeader("Content-Disposition","attachment;filename="+filename); //獲取在該目錄上檔案的真實路徑 inputStream需要使用 String realPath = this.getServletContext().getRealPath("download/"+filename); ServletOutputStream outputStream = response.getOutputStream(); InputStream in = new
FileInputStream(realPath); int len = 0; byte[] buffer = new byte[1024]; while((len=in.read(buffer))>0) { outputStream.write(buffer); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

5.解決檔案下載檔名為中文亂碼問題

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

        //*******檔名稱是中文的下載*******


        //獲得要下載的檔案的名稱
        String filename = request.getParameter("filename");//????.jpg
        //解決獲得中文引數的亂碼
        filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//你好.jpg


        //獲得請求頭中的User-Agent
        String agent = request.getHeader("User-Agent");
        //根據不同瀏覽器進行不同的編碼
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        } else if (agent.contains("Firefox")) {
            // 火狐瀏覽器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?"
                    + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它瀏覽器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");             
        }



        //要下載的這個檔案的型別-----客戶端通過檔案的MIME型別去區分型別
        response.setContentType(this.getServletContext().getMimeType(filename));
        //告訴客戶端該檔案不是直接解析 而是以附件形式開啟(下載)----filename="+filename 客戶端預設對名字進行解碼
        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);

        //獲取檔案的絕對路徑
        String path = this.getServletContext().getRealPath("download/"+filename);
        //獲得該檔案的輸入流
        InputStream in = new FileInputStream(path);
        //獲得輸出流---通過response獲得的輸出流 用於向客戶端寫內容
        ServletOutputStream out = response.getOutputStream();
        //檔案拷貝的模板程式碼
        int len = 0;
        byte[] buffer = new byte[1024];
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }

        in.close();
        //out.close();

    }