zip相关工具类
private static final String SLASH = "/";
private static final String EMPTY = "";
@RequestMapping("test")
public ResponseEntity<Resource> test() throws IOException {
ByteArrayResource byteArrayResource = new ByteArrayResource(zipFileAsByteArray("C:\\test"));
HttpHeaders headers = new HttpHeaders();
headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
headers.add("Content-Disposition", "attachment; filename=abc.zip");
headers.add("Pragma", "no-cache");
headers.add("Expires", "0");
headers.add("Last-Modified", new Date().toString());
headers.add("ETag", String.valueOf(System.currentTimeMillis()));
return ResponseEntity.ok().headers(headers).contentLength(byteArrayResource.contentLength())
.contentType(MediaType.parseMediaType("application/octet-stream"))
.body(byteArrayResource);
}
/**
* 读取一个目录或者文件
*
* @param path
* @return
* @throws IOException
*/
private byte[] zipFileAsByteArray(String path) throws IOException {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream)) {
compressRecursively(zipOutputStream, new File(path), EMPTY);
zipOutputStream.finish();
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* 递归压缩文件夹
*
* @param zipOutputStream
* @param file
* @param path
* @throws IOException
*/
private void compressRecursively(ZipOutputStream zipOutputStream, File file, String path) throws IOException {
if (file.isDirectory()) {
for (File data : file.listFiles()) {
compressRecursively(zipOutputStream, data, path + file.getName() + SLASH);
}
} else {
compressFile(zipOutputStream, path, file);
}
}
/**
* 压缩文件夹
*
* @param zipOutputStream
* @param path
* @param file
* @throws IOException
*/
private void compressFile(ZipOutputStream zipOutputStream, String path, File file) throws IOException {
try (FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);) {
zipOutputStream.putNextEntry(new ZipEntry(path + file.getName()));
while (inputStreamReader.ready()) {
zipOutputStream.write(inputStreamReader.read());
}
}
}