而Apache Common Compress為了Java程式開發者提供了最便利的解決途徑,它除了提供目前常用壓縮格式之IOStream介面及實作外,亦提供了原本JDK壓縮物件中支援不甚完善的編碼設定解決之道,當然也提供了壓縮率及加密的設定實作。
以下程式碼主要示意如何在servlet中,利用Apache Httpclient以及ZipAchieveStream將檔案http串流經過壓縮輸出,紅字部分為自定參數。
/** Handle File Name **/ String userAgent = request.getHeader("User-Agent"); String filename = request.getParameter("filename"); // .zip file name if (userAgent.contains("MSIE")) { filename = java.net.URLEncoder.encode(filename, "utf-8"); filename = filename.replace("+", "%20"); } response.setHeader( "Content-Disposition", "attachment; filename=\"" + new String(filename.getBytes("utf-8"), "ISO8859_1" ) + "\""); /** Handle Zip Compress and output **/ response.setContentType("application/zip"); response.setCharacterEncoding("UTF-8"); ServletOutputStream sOut = response.getOutputStream(); ZipArchiveOutputStream zout = new ZipArchiveOutputStream(sOut); HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod(sourceURL); getMethod.setFollowRedirects(false); httpClient.executeMethod(getMethod); if(getMethod.getStatusCode() != 200){ continue; } InputStream is = getMethod.getResponseBodyAsStream(); ZipArchiveEntry zipEntry = new ZipArchiveEntry(sourceFilename,"UTF-8")); zout.putArchiveEntry(zipEntry); zout.setEncoding("UTF-8"); int length; while((length = is.read(buffer) > 0){ zout.write(buffer, 0, length); } zout.closeArchiveEntry(); is.close(); zout.close(); response.flushBuffer();// http response
說穿了,這程式片段就是做了水管工的工作而已,相當的容易理解。如果你試著修改了但是無法運作,那麼一定是因為是我把對資料夾的遞迴壓縮,為了範例簡化為單檔壓縮的緣故,請努力循著debug流程就可以解決,如果真的有不明白為什麼要這樣寫的部份,歡迎留言詢問,我有心就會回覆的。
不知道有沒有機會用到XD
ReplyDelete