tutorial español ejemplo decompress java spring rest zip zipoutputstream

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(); }