Я пытаюсь загрузить несколько файлов в виде zip-файла, я отправляю запрос AJAX с данными моей формы на сервер, который сжимает файл и возвращает его для загрузки клиенту со следующим кодом:
function downloadDocs(arrays) {
console.log("Call download");
var text = JSON.stringify(arrays);
$("#selectedList").val(text);
var formData = new FormData($("#formSelectionFiles")[0]);
formData.append("candidateId", $("#candidateId").val());
$.ajax({
type : "POST",
url : "${contextPath}/ajax/candidate/onboarding/multidownload?data=",
contentType: false,
processData: false,
data : formData,
success : function(data) {
var blob = new Blob([data], {type: "application/octet-stream"});
//URL.createObjectURL(blob)
saveAs(blob, "download.zip");
console.log("SUCCESS : " + data);
},
error : function(e) {
console.log("ERROR : ", e);
}
});
}
Мой контроллер для сопоставления URL:
@RequestMapping(value = "/ajax/candidate/onboarding/multidownload", method = RequestMethod.POST
, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public @ResponseBody byte[] downloadCandidateDoc(HttpServletRequest req, HttpServletResponse res, Long candidateId,
String selectedList) {
System.out.println(selectedList);
if (TextUtils.isEmpty(selectedList)) {
return null;
}
final Type token = (Type) new TypeToken<ArrayList<DownloadItem>>() {
}.getType();
final GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();
final List<DownloadItem> fileList = gson.fromJson(selectedList, token);
return candidateService.downloadCandidateDocs(res, String.valueOf(candidateId), fileList);
}
Мой сервис:
public byte[] downloadCandidateDocs(HttpServletResponse res, String id, List<DownloadItem> files) {
final String candidateDir = MediaUtil.getAbsolutePath("upload_candidate", id);
List<String> fileList = new ArrayList<>();
if (files != null && !files.isEmpty()) {
for (DownloadItem str : files) {
System.out.println("file name: " + str.getUrl());
fileList.add(new File(candidateDir, str.getUrl()).getAbsolutePath());
}
}
try {
return FileStreamUtil.zipfiles(fileList);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
Этот код используется для создания zip-файла:
public static byte[] zipfiles(List<String> files) throws IOException {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
byte bytes[] = new byte[2048];
for (String fileName : files) {
File fileToZip = new File(fileName);
FileInputStream fis = new FileInputStream(fileName);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zos.putNextEntry(zipEntry);
int bytesRead;
while ((bytesRead = fis.read(bytes)) != -1) {
zos.write(bytes, 0, bytesRead);
}
zos.closeEntry();
fis.close();
fis.close();
}
zos.close();
return baos.toByteArray();
}
И вот результат, который я получаю в выходном потоке: