下面是关于“Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解”的完整攻略。
前言
在Java程序中,我们有时会需要将一个文件夹以及其中的文件打包成ZIP格式的压缩文件并下载。本文将介绍如何实现这个功能。
代码实现
Java提供了ZipOutputStream类和ZipEntry类,可以轻松地打包一个文件夹中的所有文件并生成ZIP文件。我们可以使用HttpServletResponse将ZIP文件响应给客户端,让客户端下载。
以下是示例代码:
@RequestMapping(value = "/download", method = RequestMethod.GET)
public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {
String sourceFolderPath = "D:\\SourceFolder"; // 需要打包的文件夹路径
String zipFilePath = "D:\\output\\output.zip"; // 生成的ZIP文件路径
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipFilePath);
zos = new ZipOutputStream(fos);
addFolderToZip("", sourceFolderPath, zos);
zos.close();
fos.close();
File downloadFile = new File(zipFilePath);
FileInputStream inputStream = new FileInputStream(downloadFile);
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\"" + downloadFile.getName() + "\"");
IOUtils.copy(inputStream, response.getOutputStream()); // 使用IOUtils将ZIP响应给客户端
inputStream.close();
response.flushBuffer();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws IOException {
File folder = new File(srcFile);
if (folder.isDirectory()) {
addFolderToZip(path, srcFile, zip);
} else {
byte[] buf = new byte[1024];
int len;
FileInputStream in = new FileInputStream(srcFile);
zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));
while ((len = in.read(buf)) > 0) {
zip.write(buf, 0, len);
}
}
}
private void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws IOException {
File folder = new File(srcFolder);
for (String fileName : folder.list()) {
if (path.equals("")) {
addFileToZip(folder.getName(), srcFolder + "/" + fileName, zip);
} else {
addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + fileName, zip);
}
}
}
上述代码中,我们使用了两个方法,其中addFolderToZip()方法将一个文件夹中的文件递归地压入到ZipOutputStream中,而addFileToZip()方法则将单个文件加入到ZipOutputStream中。 download()方法中,首先调用addFolderToZip()方法将文件夹中的文件压入到ZIP中,然后使用IOUtils将ZIP文件响应给客户端,让客户端进行下载。
示例
以下是使用该方法将“D:\TestFolder”文件夹中的文件打包成ZIP并进行下载操作的示例:
- 在Spring Boot项目中编写如上代码(不需要对@RequestMapping注解进行修改)。
- 启动Spring Boot项目。
- 在浏览器地址栏中输入http://localhost:8080/download,按下回车。
- 下载名为“output.zip”的文件,解压该ZIP文件,可以看到其中包含了“D:\TestFolder”文件夹中的所有文件。
以下是使用该方法将非中文文件名的文件夹打包成ZIP并进行下载操作的示例:
- 在计算机根目录下新建一个文件夹,名为“TestFolder”,并在其中包含若干个非中文文件名的文件。
- 将上述代码中“D:\TestFolder”修改为“TestFolder”的绝对路径,然后重新编译并运行该代码。
- 在浏览器地址栏中输入http://localhost:8080/download,按下回车。
- 下载名为“output.zip”的文件,解压该ZIP文件,可以看到其中包含了TestFolder文件夹中的所有文件。
总结
现在,您已经学会了如何使用Java将文件夹保留目录打包为ZIP压缩包,并响应给客户端进行下载,同时,也可以适当地修改该代码以保证对中文文件名的兼容性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java将文件夹保留目录打包为 ZIP 压缩包并下载的教程详解 - Python技术站