springboot 文件夹Zip压缩,遇到目录则创建目录,再将目录下的文件放在目录下,否则直接添加即可,需要注意目录包含目录的情况
时间: 2024-03-21 07:43:30 浏览: 45
以下是一个使用Spring Boot实现的示例代码,实现对文件夹的Zip压缩,遇到目录则创建目录,再将目录下的文件放在目录下,否则直接添加。同时,代码还考虑了目录包含目录的情况。
```java
@RestController
public class ZipController {
@GetMapping("/zip")
public void zipDirectory(HttpServletResponse response) throws IOException {
File directoryToZip = new File("path/to/directory");
byte[] buffer = new byte[1024];
try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) {
zipSubDirectory("", directoryToZip, zos, buffer);
}
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=\"directory.zip\"");
}
private void zipSubDirectory(String basePath, File directory, ZipOutputStream zos, byte[] buffer) throws IOException {
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
String path = basePath + file.getName() + "/";
ZipEntry zipEntry = new ZipEntry(path);
zos.putNextEntry(zipEntry);
zipSubDirectory(path, file, zos, buffer);
zos.closeEntry();
} else {
ZipEntry zipEntry = new ZipEntry(basePath + file.getName());
zos.putNextEntry(zipEntry);
try (FileInputStream fis = new FileInputStream(file)) {
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
}
zos.closeEntry();
}
}
}
}
```
在这个示例中,我们首先获取要压缩的目录(`directoryToZip`),然后遍历目录中的所有文件和子目录。如果当前项是一个目录,则创建一个对应的目录项,并递归地对它进行压缩。如果当前项是一个文件,则创建一个对应的文件项,并将文件内容写入到zip文件中。
需要注意的是,在上面的代码中,我们使用`zipSubDirectory()`方法遍历了目录中的所有文件和子目录,并对它们进行压缩。在递归调用时,我们需要传递一个`basePath`参数,表示当前压缩项的基础路径。这个基础路径包括了所有父级目录的名称,以及当前目录或文件的名称。例如,假设我们要压缩的目录是`/foo/bar`,那么在遍历到`/foo/bar/baz/test.txt`文件时,`basePath`应该是`baz/`,而不是`/foo/bar/baz/`。这样才能保证最终压缩后的zip文件中包含了原目录的所有子目录结构。
阅读全文