本文通過完整 Servlet 範例,演示 Java Web 中 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>
getOutputStream() 而非 getWriter()