Я хочу заархивировать массив File
в zip-файл и отправить его в браузер.Inputstream
каждого File
является шейп-файлом и фактически состоит из нескольких файлов (.shp, .dbf, .shx, ...).
Когда я отправляю только один File
сследующий код, он работает правильно, и возвращается zip-файл со всеми необходимыми файлами в нем.
Код для отправки одного файла
FileInputStream is = new FileInputStream(files.get(0));
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=" + getCurrentUser(request).getNiscode() + ".zip");
while (is.available() > 0) {
response.getOutputStream().write(is.read());
}
is.close();
if (response.getOutputStream() != null) {
response.getOutputStream().flush();
response.getOutputStream().close();
}
Когда я пытаюсьЧтобы отправить все файлы вместе, возвращается zip-файл с нужными папками, но в каждой папке присутствует только один элемент с расширением .file.Это как-то связано с записями ZipOutputStream
?
кода для отправки всех файлов
byte[] zip = this.zipFiles(files, Ids);
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename="test.zip");
response.getOutputStream().write(zip);
response.flushBuffer();
private byte[] zipFiles(ArrayList<File> files, String[] Ids) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
int count = 0;
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
zos.putNextEntry(new ZipEntry(Ids[count] + "/"));
zos.putNextEntry(new ZipEntry(Ids[count] + "/" + file.getName()));
while (fis.available() > 0) {
zos.write(fis.read());
}
zos.closeEntry();
fis.close();
count ++;
}
zos.flush();
baos.flush();
zos.close();
baos.close();
return baos.toByteArray();
}