日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

發(fā)布時間:2025/3/12 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??程序員在做web等項目的時候,往往都需要添加文件上傳、下載、刪除的功能,有時是單文件,有時多文件批量 操作,而這些功能的代碼程序員可以自己收藏起來當(dāng)成工具使用,這樣,程序員在進行程序設(shè)計的時候就會事半功倍 了,那么接下來的博客將會介紹各個框架的文件上傳和下載功能的使用方法。?

? 這篇博文主要是講如何將多個文件壓縮并下載下來:


?主要有以下幾個步驟:

1。 首先先遍歷出某個文件夾所含有的所有文件

import java.io.File; import java.util.Vector; public class A {public static void recursion(String root, Vector<String> vecFile) { /*根據(jù)路徑生成一個文件*/File file = new File(root);File[] subFile = file.listFiles(); /*遍歷文件里面的所有文件*/for (int i = 0; i < subFile.length; i++) { /*如果是文件夾,則遞歸下去尋找文件夾里面的文件*/ if (subFile[i].isDirectory()) { recursion(subFile[i].getAbsolutePath(), vecFile); } else { /*如果不是文件夾的話就直接添加到vector容器里面去 (vector類稱作向量類,它實現(xiàn)了動態(tài)數(shù)組,用于元素數(shù)量變化的對象數(shù)組。像數(shù)組一樣,vector類也用從0開始的下標(biāo)表示元素的位置;但和數(shù)組不同的是,當(dāng)vector對象創(chuàng)建后,數(shù)組的元素個數(shù)會隨著vector對象元素個數(shù)的增大和縮小而自動變化。)*/ 2.將遍歷出來的文件進行壓縮和下載:String filename = subFile[i].getName();vecFile.add(filename);}}}public static void main(String[] args) {Vector<String> vecFile = new Vector<String>();recursion("D:/logs/2", vecFile);for (String fileName : vecFile) {System.out.println(fileName);}} }

2。 將遍歷出來的文件進行壓縮和下載:(一個一個壓縮)

2.1 設(shè)置下載文件的名稱

String fileName = "temp1.zip";response.setContentType("text/html; charset=UTF-8"); // 設(shè)置編碼字符response.setContentType("application/x-msdownload"); // 設(shè)置內(nèi)容類型為下載類型response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 設(shè)置下載的文件名稱OutputStream out = response.getOutputStream(); // 創(chuàng)建頁面返回方式為輸出流,會自動彈出下載框System.out.println("配置成功");

2.2 創(chuàng)建壓縮文件需要的空的zip包

String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/");/* 輸出basePath的路徑,方便調(diào)試 */System.out.println(zipBasePath);/* 創(chuàng)建壓縮文件需要的空的zip包 ,這里是自動生成的,不用我們自己去生成 */String zipFilePath = zipBasePath + "temp.zip";System.out.println("create the empty zip file successfully??????");

2.3 根據(jù)臨時的zip壓縮包路徑,創(chuàng)建zip文件

File zip = new File(zipFilePath);if (!zip.exists()) {zip.createNewFile();} System.out.println("create the zip file successfully");

2.4?創(chuàng)建zip文件輸出流

FileOutputStream fos = new FileOutputStream(zip);ZipOutputStream zos = new ZipOutputStream(fos);System.out.println("create the empty zip stream successfully");

2.5?循環(huán)讀取文件路徑集合,獲取每一個文件的路徑(將文件一個一個進行壓縮)

for (String fp : vecFile) {File f = new File(fp); // 根據(jù)文件路徑創(chuàng)建文件zipFile(f, zos); // 將每一個文件寫入zip文件包內(nèi),即進行打包}System.out.println("get the path successfully"); ???????????????//?fos.close();//如果這樣關(guān)兩次的話會報錯,java.io.IOException: Stream closedzos.close();System.out.println("ok??");

2.6?將打包后的文件寫到客戶端,有兩種方法可以實現(xiàn)(下面會進行介紹),這里使用緩沖流輸出

InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath));byte[] buff = new byte[4096];int size = 0;while ((size = fis.read(buff)) != -1) {out.write(buff, 0, size);}System.out.println("package is packed successfully");

2.7?釋放和關(guān)閉輸入輸出流

????????????????out.flush();//清楚緩存out.close();fis.close();

2.8?文件壓縮的方法

public void zipFile(File inputFile, ZipOutputStream zipoutputStream) {try {if (inputFile.exists()) { // 判斷文件是否存在if (inputFile.isFile()) { // 判斷是否屬于文件,還是文件夾// 創(chuàng)建輸入流讀取文件FileInputStream fis = new FileInputStream(inputFile);BufferedInputStream bis = new BufferedInputStream(fis);// 將文件寫入zip內(nèi),即將文件進行打包ZipEntry ze = new ZipEntry(inputFile.getName()); // 獲取文件名zipoutputStream.putNextEntry(ze);// 寫入文件的方法,同上byte[] b = new byte[1024];long l = 0;while (l < inputFile.length()) {int j = bis.read(b, 0, 1024);l += j;zipoutputStream.write(b, 0, j);}// 關(guān)閉輸入輸出流bis.close();fis.close();} else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫入ziptry {File[] files = inputFile.listFiles();for (int i = 0; i < files.length; i++) {zipFile(files[i], zipoutputStream);}} catch (Exception e) {e.printStackTrace();}}}} catch (Exception e) {e.printStackTrace();}}


這個是我在團隊中的一個項目開發(fā)過程。在這個過程中,我主要遇到了幾個常見的問題,不過最后都一一被我解決掉了。

1. 因為我要下載壓縮的文件是一個日志不斷動態(tài)生成的文件,所以需要先對其復(fù)制到另外一個文件夾再進行壓縮以及下載;

2. 對IO流的一些 知識不是很熟悉(學(xué)習(xí)并參考:https://blog.csdn.net/weixin_37766296/article/details/80070847)


文件從一個文件夾復(fù)制到另一個文件夾:

// 讀寫文件public static void copy1() throws Exception{ FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt");(原文件路徑) FileOutputStream fos = new FileOutputStream("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt"); int len = 0; byte[] buf = new byte[1024]; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fos.close(); fis.close(); } /*復(fù)制過去之后格式發(fā)生了變化,故放棄這個方法*/public void copy2() {FileWriter fw = null;BufferedReader br = null;try {fw = new FileWriter("D:\\java1\\eclipse\\javadownload\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\SCNU_OAuth2\\logs\\1\\log.txt",true);br = new BufferedReader(new InputStreamReader(new FileInputStream("C:\\Users\\Administrator\\Desktop\\1\\log.txt"), "UTF-8"));(原文件路徑)String line = null;while ((line = br.readLine()) != null) {// System.out.println("文件內(nèi)容: " + line);fw.write(line);fw.flush();}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fw != null) {try {fw.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

對于單個文件下載:

可以參考:https://blog.csdn.net/alan_liuyue/article/details/72772502

參考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面關(guān)于流的關(guān)閉有點瑕疵)


歡迎大家前來討論~




總結(jié)

以上是生活随笔為你收集整理的javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。