首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java GZIP 壓縮傳輸與圖片下載實戰代碼

     編輯:Java 相關知識

本文通過完整 Servlet 範例,演示 Java Web 中 GZIP 壓縮回應數據與圖片文件下載兩大常見功能的實現細節。

GZIP 壓縮回應

壓縮能有效減少傳輸體積,但僅適用於較大數據(通常 > 200KB)。小文件壓縮後反而可能變大,得不償失。

public class GzipServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        String str = "vuttyjhgyurc湖南長沙surdivsf安徽蕪湖890-80897或許更長v就會習慣這樣tvsduvgkjxhvnxzc.nlkcjsdfpeifniuq4ey8f048eyuyli" 
                + "skchkxhckxzncnxclkjhasliduhasiduisugdlisgdlkjadhlksjhdlkasjdhasklhdlkjsahashdkskdjhkdjshkldsjhlksjhfkljd";
        
        byte[] src = str.getBytes("utf-8");
        
        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
        GZIPOutputStream gOut = new GZIPOutputStream(bOut);
        gOut.write(src);
        gOut.close();
        
        byte[] dest = bOut.toByteArray();
        
        // 關鍵:設置 Content-Encoding 告訴瀏覽器已壓縮
        resp.setHeader("Content-Encoding", "gzip");
        resp.setContentType("text/html;charset=utf-8");
        
        System.out.println("壓縮前長度:" + src.length);
        System.out.println("壓縮後長度:" + dest.length);
        
        resp.getOutputStream().write(dest);
    }
}

圖片文件下載

關鍵點:

  • 設置 Content-Type: application/force-download 強制下載
  • 設置 Content-Disposition: attachment; filename=... 指定下載文件名
  • 中文文件名需 URLEncoder.encode 處理
  • 使用 ClassLoader.getResourceAsStream 讀取 classpath 下資源
public class DownServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) 
            throws ServletException, IOException {
        resp.setContentType("application/force-download");
        String fileName = "4.jpg";
        
        // 中文文件名處理
        // fileName = URLEncoder.encode(fileName, "utf-8");
        
        // 從 classpath 讀取(圖片放在 src 目錄下)
        InputStream in = DownServlet.class.getClassLoader().getResourceAsStream(fileName);
        
        resp.setHeader("content-Disposition", "attachment;filename='" + fileName + "'");
        
        OutputStream out = resp.getOutputStream();
        byte[] buf = new byte[512];
        int len;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
        }
    }
}

前端頁面

<a href="/helloWeb/gzip">頁面內容壓縮演示--gzip</a><br/>
<a href="down">下載圖片</a>

注意事項

  • GZIP 壓縮需客戶端支援(現代瀏覽器均支援)
  • 圖片下載時,輸出流用 getOutputStream() 而非 getWriter()
  • 生產環境建議配合 Nginx/Apache 靜態資源壓縮,減輕應用服務器壓力
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved