Struts2 動態壓縮成zip文件下載
功能:文件下載
簡述:
1.根據畫面上的復選框進行文件打包下載
2.待下載文件保存在服務器的硬盤上,打包過程中不生成臨時文件
3.打包過程中需要動態創建一個txt文件一并打進zip包中
4.頁面上沒有文件被選擇的場合,按下【下載】按鈕后,什么都不做(不刷新頁面)
部分內容參考自互聯網,如果錯誤,歡迎指正。
Struts配置文件
<!-- 數據下載Action --> <action name="downloadWaveData" class="DownloadAction"> <result name="nodata" type="httpheader"> <param name="status">204</param> </result> </action>
Action代碼
private OutputStream res; private ZipOutputStream zos;// action的主方法 public String execute() throws Exception { if (有數據可下載) {; // 預處理 preProcess(); } else { // 沒有文件可下載的場合,返回nodata,設定參照struts配置文件 return "nodata"; } // 在這里編輯好需要下載的數據 // 文件可以是硬盤上的 // 文件也可以是自己寫得數據流,如果是自己寫得數據流,請參看outputZipFile方法中的【2.】 File file = new File(); file = ... outputZipFile(file); // 后處理 afterProcess(); return null; } // 預處理 public void preProcess() throws Exception { HttpServletResponse response = ServletActionContext.getResponse(); res = response.getOutputStream(); //清空輸出流 response.reset(); //設定輸出文件頭 response.setHeader("Content-disposition ","attachment; filename=a.zip "); response.setContentType("application/zip"); zos = new ZipOutputStream(res); } // 后處理 public void afterProcess() throws Exception { zos.close(); res.close(); } // 寫文件到客戶端 private void outputZipFile(File file) throws IOException, FileNotFoundException { ZipEntry ze = null; byte[] buf = new byte[1024]; int readLen = 0; File file = (File)fileList.get(i); // 1.動態壓縮一個File到zip中 // 創建一個ZipEntry,并設置Name和其它的一些屬性 // 壓縮包中的路徑和文件名稱 ze = new ZipEntry("1\\1" + f.getName()); ze.setSize(file.length()); ze.setTime(file.lastModified()); // 將ZipEntry加到zos中,再寫入實際的文件內容 zos.putNextEntry(ze); InputStream is = new BufferedInputStream(new FileInputStream(file)); // 把數據寫入到客戶端 while ((readLen = is.read(buf, 0, 1024)) != -1) { zos.write(buf, 0, readLen); } is.close(); // 2.動態壓縮一個String到zip中 String customFile = "This is a text file."; // 壓縮包中的路徑和文件名稱 ZipEntry cze = new ZipEntry(“1\\1\\” + "Test.txt"); zos.putNextEntry(cze); // 利用ByteArrayInputStream把流數據寫入到客戶端 is = new ByteArrayInputStream(customFile.getBytes()); while ((readLen = is.read(buf, 0, 1024)) != -1) { zos.write(buf, 0, readLen); } }</pre>
本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!