<html>
<head>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
</head>
<body>
<form id="form" method="post" enctype="multipart/form-data">
file: <input type="file" name="files" multiple />
<input id="submit" type="button" value="submit" />
</form>
<script>
$(function () {
$("#submit").click(function () {
let formData = new FormData($("#form")[0]);
let url = "http://localhost:8701/auth/oss_zip_down";
let xhr = new XMLHttpRequest();
xhr.open("post", url, true);
xhr.responseType = "blob";
xhr.setRequestHeader("Authorization",
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuaWNrbmFtZSI6IiIsInJvbGUiOiIiLCJpZCI6MTM4MDc5NDY1NDUwNzA0MDgzMSwiZXhwIjoxNjQ4OTAzODEwODgyLCJ1c2VybmFtZSI6InN1cGVyIn0.UG-waVzA9SMq4gIIf5fXy23OjwTdb3WlK5uvGeFmqmQ"
)
xhr.send(formData);
xhr.onload = function () {
if (this.status == 200) {
let blob = this.response;
let a = document.createElement('a');
a.download = "files.zip";
a.href = window.URL.createObjectURL(blob);
a.click();
}
}
});
});
</script>
</body>
</html>
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipTools {
private ZipTools() {
}
/**
* 压缩上传的文件并下载
*
* @param files List<MultipartFile>
* @param response HttpServletResponse
* @throws IOException 文件处理异常
*/
public static void compressionAndDown(List<MultipartFile> files, HttpServletResponse response) throws IOException {
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=files.zip");
response.addHeader("Content-Length", "");
response.setContentType("application/octet-stream");
List<ZipFile> zipFiles = getZipFiles(files);
compressionFormZipFile(zipFiles, response.getOutputStream());
}
/**
* 获取ZipFile
*
* @param files List<MultipartFile>
* @return List<ZipFile>
*/
public static List<ZipFile> getZipFiles(List<MultipartFile> files) {
return files.stream().map(i -> {
ZipFile zipFile = null;
try {
zipFile = new ZipFile();
zipFile.setIs(i.getInputStream());
zipFile.setName(i.getOriginalFilename());
} catch (IOException e) {
e.printStackTrace();
}
return zipFile;
}).collect(Collectors.toList());
}
/**
* 压缩zip file
*
* @param files ZipFile {inputStream,name} 文件输入流,文件全称
* @param os HttpServletResponse getOutputStream()
*/
public static void compressionFormZipFile(List<ZipFile> files, OutputStream os) {
try (ZipOutputStream zipOut = new ZipOutputStream(os)) {
files.forEach(i -> {
try {
InputStream is = i.getIs();
ZipEntry zipEntry = new ZipEntry(i.getName());
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = is.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 压缩文件流并输出二进制流
*
* @param inputStreams 二进制文件输入流
* @param outputStream HttpServletResponse getOutputStream()
* @param fileType .png ...
*/
public static void compressionFormInputStream(List<InputStream> inputStreams, OutputStream outputStream, String fileType) {
try (ZipOutputStream zipOut = new ZipOutputStream(outputStream);) {
//向压缩包中添加多个文件
inputStreams.forEach(i -> {
try {
ZipEntry zipEntry = new ZipEntry(System.currentTimeMillis() + fileType);
zipOut.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = i.read(bytes)) >= 0) {
zipOut.write(bytes, 0, length);
}
zipOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
@Getter
@Setter
static
class ZipFile {
private InputStream is;
private String name;
}
}