原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000
將多個文件壓縮並下載下來:(綠色為修改原博客的位置)
注意:需要使用<a>標簽來調用此方法,ajax不管用無法彈出選擇下載位置的彈窗
@RequestMapping("/uploads")
public void recursion(String root, Vector<java.io.File> vecFile,HttpServletResponse response,HttpServletRequest request) throws IOException{
//根據路徑生成一個文件
root = "d:\\upload\\A-1-1-\\0001\\001\\001";
java.io.File file = new java.io.File(root);
java.io.File[] subFile = file.listFiles();
//遍歷文件里面的所有文件
for (int i = 0; i < subFile.length; i++) {
/*如果是文件夾,則遞歸下去尋找文件夾里面的文件*/
if (subFile[i].isDirectory()) {
//recursion(subFile[i].getAbsolutePath(), vecFile);
} else {
//如果不是文件夾的話就直接添加到vector容器里面去
//將遍歷出來的文件進行壓縮和下載:
// String filename = subFile[i].getName(); // vecFile.add(filename);
vecFile.add(subFile[i]);
}
}
//設置下載文件的名稱
String fileName = "temp1.zip";
response.setContentType("text/html; charset=UTF-8"); // 設置編碼字符
response.setContentType("application/x-msdownload"); // 設置內容類型為下載類型
response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 設置下載的文件名稱
OutputStream out = response.getOutputStream(); // 創建頁面返回方式為輸出流,會自動彈出下載框
//創建壓縮文件需要的空的zip包
String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/");
/* 輸出basePath的路徑,方便調試 */
System.out.println(zipBasePath);
/* 創建壓縮文件需要的空的zip包 ,這里是自動生成的,不用我們自己去生成 */
String zipFilePath = zipBasePath + "temp.zip";
System.out.println("create the empty zip file successfully??????");
//根據臨時的zip壓縮包路徑,創建zip文件
java.io.File zip = new java.io.File(zipFilePath);
if (!zip.exists()) {
zip.createNewFile();
}
System.out.println("create the zip file successfully");
// 創建zip文件輸出流
FileOutputStream fos = new FileOutputStream(zip);
ZipOutputStream zos = new ZipOutputStream(fos);
System.out.println("create the empty zip stream successfully");
//循環讀取文件路徑集合,獲取每一個文件的路徑(將文件一個一個進行壓縮)
for (java.io.File fp : vecFile) {
zipFile(fp, zos); // 將每一個文件寫入zip文件包內,即進行打包
}
System.out.println("get the path successfully");
// fos.close();//如果這樣關兩次的話會報錯,java.io.IOException: Stream closed
zos.close();
System.out.println("ok??");
//將打包后的文件寫到客戶端,使用緩沖流輸出
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");
//釋放和關閉輸入輸出流
out.flush();//清楚緩存
out.close();
fis.close();
}
/**
* 文件壓縮的方法
* @param inputFile
* @param zipoutputStream
*/
public void zipFile(java.io.File inputFile, ZipOutputStream zipoutputStream) {
try {
if (inputFile.exists()) { // 判斷文件是否存在
if (inputFile.isFile()) { // 判斷是否屬於文件,還是文件夾
// 創建輸入流讀取文件
FileInputStream fis = new FileInputStream(inputFile);
BufferedInputStream bis = new BufferedInputStream(fis);
// 將文件寫入zip內,即將文件進行打包
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);
}
// 關閉輸入輸出流
bis.close();
fis.close();
} else { // 如果是文件夾,則使用窮舉的方法獲取文件,寫入zip
try {
java.io.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();
}
}
對於單個文件下載:
可以參考:https://blog.csdn.net/alan_liuyue/article/details/72772502
參考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面關於流的關閉有點瑕疵)
