1. 程式人生 > 其它 >javaweb學習10:Response下載檔案

javaweb學習10:Response下載檔案

javaweb學習10:Response下載檔案

  • HttpServletResponse物件:

    • web伺服器接收到客戶端的HTTP請求,會針對這個請求,分別建立一個代表請求的HttpServletRequest物件,一個代表響應的HttpServletResponse物件;

    • 如果要獲取我們客戶端請求過來的引數:找HttpServletRequest;

    • 如果要給客戶端響應一些資訊:找HttpServletResponse;

       

  • 簡單分類:

    • 負責向瀏覽器傳送資料的方法:

      ServletOutputStream getOutputStream() throws IOException;
      PrintWriter getWriter() throws IOException;
    • 負責向瀏覽器傳送響應頭的方法:

      void setCharacterEncoding(String var1);

      void setContentLength(int var1);

      void setContentLengthLong(long var1);

      void setContentType(String var1);
      void setDateHeader(String var1, long var2);

      void addDateHeader(String var1, long var2);

      void setHeader(String var1, String var2);

      void addHeader(String var1, String var2);

      void setIntHeader(String var1, int var2);

      void addIntHeader(String var1, int var2);
    • 響應的狀態碼:

      int SC_OK = 200;
      int SC_NOT_FOUND = 404;
      int SC_INTERNAL_SERVER_ERROR = 500;
      int SC_BAD_GATEWAY = 502;

 

 

  • 常見應用:

    • 向瀏覽器輸出訊息;

    • 下載檔案;

      1. 要獲取下載檔案的路徑;

      2. 下載的檔名是什麼;

      3. 設定讓瀏覽器支援下下載我們需要的東西;

      4. 獲取下載檔案的輸入流;

      5. 建立緩衝區

      6. 獲取OutputStream物件;

      7. 將FileOutputStream流寫入到buffer緩衝區;

      8. 使用OutputStream將緩衝區中的資料輸出到客戶端;

       

 

  • 程式碼案例:

    /**
    * 下載檔案
    */
    public class FileServlet extends HttpServlet {

       /**
        * 1. 要獲取下載檔案的路徑;
        * 2. 下載的檔名是什麼;
        * 3. 設定讓瀏覽器支援下下載我們需要的東西;
        * 4. 獲取下載檔案的輸入流;
        * 5. 建立緩衝區
        * 6. 獲取OutputStream物件;
        * 7. 將FileOutputStream流寫入到buffer緩衝區;
        * 8. 使用OutputStream將緩衝區中的資料輸出到客戶端;
        *
        * @param req
        * @param resp
        * @throws ServletException
        * @throws IOException
        */

       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           //1. 要獲取下載檔案的路徑;
           //String realPath = this.getServletContext().getRealPath("/1.png");
           String realPath = "D:\\demo\\1.PNG";
           System.out.println("下載檔案的路徑;"+realPath);

           //2. 下載的檔名是什麼;
           String fileName = realPath.substring(realPath.lastIndexOf("//") + 1);
           //3. 設定讓瀏覽器支援下載我們需要的東西
           //中文檔名需要使用URLEncoder.encode()編碼,否則有可能亂碼
           resp.setHeader("Content-disposition","attachment;filename="+              URLEncoder.encode(fileName,"UTF-8"));
           //4. 獲取下載檔案的輸入流;
           FileInputStream in = new FileInputStream(realPath);
           //5. 建立緩衝區
           int len=0;
           byte[] buffer = new byte[1024];
           //6. 獲取OutputStream物件;
           ServletOutputStream out = resp.getOutputStream();
           //7. 將FileOutputStream流寫入到buffer緩衝區;
           //8. 使用OutputStream將緩衝區中的資料輸出到客戶端;
           while ((len=in.read(buffer))!=-1){
               out.write(buffer,0,len);
          }

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

      }

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