java - español - Spring REST-crea un archivo.zip y envíalo al cliente
spring rest ejemplo (2)
Quiero crear un archivo .zip que contenga mis archivos comprimidos que recibo de back-end, y luego enviar este archivo al usuario. Durante 2 días he estado buscando la respuesta y no puedo encontrar la solución adecuada, tal vez me puedas ayudar :)
Por ahora, el código es así: (Sé que no debería hacerlo todo en el controlador de primavera, pero no me importa, es solo para fines de prueba, para encontrar la manera de hacerlo funcionar)
@RequestMapping(value = "/zip")
public byte[] zipFiles(HttpServletResponse response) throws IOException{
//setting headers
response.setContentType("application/zip");
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=/"test.zip/"");
//creating byteArray stream, make it bufforable and passing this buffor to ZipOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);
//simple file list, just for tests
ArrayList<File> files = new ArrayList<>(2);
files.add(new File("README.md"));
//packing files
for (File file : files) {
//new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream, zipOutputStream);
fileInputStream.close();
zipOutputStream.closeEntry();
}
if (zipOutputStream != null) {
zipOutputStream.finish();
zipOutputStream.flush();
IOUtils.closeQuietly(zipOutputStream);
}
IOUtils.closeQuietly(bufferedOutputStream);
IOUtils.closeQuietly(byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
}
Pero el problema es que al usar el código, cuando ingreso URL: localhost: 8080 / zip obtengo el archivo: test.zip.html en lugar del archivo .zip
Cuando elimino la extensión .html y dejo solo test.zip, ¿se abre correctamente cómo evitar devolver esta extensión .html? ¿por qué se agrega?
No tengo idea qué más puedo hacer. También intenté reemplazar ByteArrayOuputStream con algo como:
OutputStream outputStream = response.getOutputStream();
y establecer el método para ser nulo, por lo que no devuelve nada, pero ¿Creó un archivo .zip que ... fue dañado?
En mi macbook después de desempaquetar el test.zip estaba obteniendo test.zip.cpgz el cual nuevamente me estaba dando el archivo test.zip y así sucesivamente ...
En Windows, el archivo .zip se dañó como dije y ni siquiera pude abrirlo.
También supongo que quitar la extensión .html automáticamente será la mejor opción, pero ¿cómo? Espero que no sea tan difícil como parece :) gracias
parece estar resuelto He reemplazado:
response.setContentType("application/zip");
con:
@RequestMapping(value = "/zip", produces="application/zip")
Y ahora tengo un archivo .zip claro y hermoso :)
Si alguno de ustedes tiene una propuesta mejor o más rápida, o simplemente quiere dar un consejo, entonces adelante, tengo curiosidad.
@RequestMapping(value="/zip", produces="application/zip")
public void zipFiles(HttpServletResponse response) throws IOException {
//setting headers
response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Content-Disposition", "attachment; filename=/"test.zip/"");
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
// create a list to add files to be zipped
ArrayList<File> files = new ArrayList<>(2);
files.add(new File("README.md"));
// package files
for (File file : files) {
//new zip entry and copying inputstream with file to zipOutputStream, after all closing streams
zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream, zipOutputStream);
fileInputStream.close();
zipOutputStream.closeEntry();
}
zipOutputStream.close();
}