Ponga Inputstream que contiene múltiples archivos en un ZipEntry

Quiero comprimir una matriz de Fileun archivo zip y enviarlo al navegador. El Inputstreamde cada uno Filees un archivo de forma, y ​​en realidad consiste en múltiples archivos (.shp, .dbf, .shx, ...).

Cuando envío solo uno Filecon el siguiente código, funciona correctamente y se devuelve un archivo zip con todos los archivos deseados.

Código para enviar un solo archivo

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

Cuando intento enviar todos los archivos juntos, se devuelve un archivo zip con las carpetas deseadas, pero en cada carpeta solo está presente un elemento con solo una extensión .file. Tiene algo que ver con las entradas de la ZipOutputStream?

Código para enviar todos los archivos

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

intente la siguiente solución:

private byte[] zipFiles(ArrayList<File> files, String[] Ids) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(baos);
    for (File file : files) {
        ZipEntry ze= new ZipEntry(file.getName());
        zos.putNextEntry(ze);

        FileInputStream fis = new FileInputStream(file);

        int len;
        while ((len = fis .read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }

        fis .close();
    }
    byte[] byteArray = baos.toByteArray();
    zos.flush();
    baos.flush();
    zos.close();
    baos.close();

    return byteArray;
}

IDK por qué pones countvariable y por qué pones dos veces zos.putNextEntry(new ZipEntry()).

Respuesta: 2

A continuación se muestra el código donde hay un servidor para aceptar múltiples conexiones de clientes y responder. El servidor puede recibir el mensaje del cliente pero el cliente no recibe los mensajes del servidor. He utilizado ...

public static class Builder <T extiende Builder <T>> {private int calorias = 0; public Builder () {} calorías públicas T (int val) {calorías = val; volver (T) ...

Soy nuevo en Java 8. Solo me pregunto cómo haría debajo de la operación usando flujos Java 8. Cualquier sugerencia public static void main (String [] args) {Integer [] arr1 = new Integer [] {1, 2, 3}; ...

primero, no estoy seguro de si esta pregunta pertenece aquí o en serverfault. Estoy usando IzPack para nuestro proyecto. Todo funciona bien en mi máquina local. Lamentablemente en mi jenkins tengo lo siguiente ...