Téléchargement de fichier Zip via HttpResponse Java


Je saisis donc une collection de blobs d'une base de données (différents types de mimétypes) et j'essaie de les compresser pour les télécharger par les utilisateurs via une réponse http. Je peux obtenir le téléchargement arrive, mais quand j'essaie d'ouvrir le fichier zip téléchargé, il dit: "L'archive est au format inconnu ou endommagé."J'ai essayé le code suivant avec application / zip, application/octet-stream et application/x-zip-compressé, mais je commence à supposer que le problème réside dans la façon dont j'ajoute les fichiers. Je suis aussi utilisation de Java 7 et Grails 2.2.4.

Toute aide à ce sujet serait grandement appréciée. Merci!

  final ZipOutputStream out = new ZipOutputStream(new FileOutputStream("test.zip"));


        for (Long id : ids){

            Object[] stream = inlineSamplesDataProvider.getAttachmentStream(id);


            if (stream) {

                String fileName = stream[0]
                String mimeType = (String) stream[1];
                InputStream inputStream = stream[2]
                byte[] byteStream = inputStream.getBytes();

                ZipEntry zipEntry = new ZipEntry(fileName)
                out.putNextEntry(zipEntry);
                out.write(byteStream, 0, byteStream.length);
                out.closeEntry();
            }
        }

        out.close();
        response.setHeader("Content-Disposition", "attachment; filename=\"" + "test.zip" + "\"");
        response.setHeader("Content-Type", "application/zip");
        response.outputStream << out;
        response.outputstream.flush();
Author: Brewster, 2015-10-20

1 answers

J'ai trouvé la réponse ici: Renvoyant ZipOutputStream au navigateur

D'accord, donc ce qui a fini par fonctionner pour moi a été de convertir le ZipOutputStream en un ByteArrayOutputStream et de l'écrire dans une réponse en tant qu'octet []:

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final ZipOutputStream out = new ZipOutputStream(baos);

        Calendar cal = Calendar.getInstance();
        String date = new SimpleDateFormat("MMM-dd").format(cal.getTime());

        final String zipName = "COA_Images-" + date + ".zip";



        for (Long id : ids){

            Object[] stream = inlineSamplesDataProvider.getAttachmentStream(id);


            if (stream) {

                String fileName = stream[0]
                String mimeType = (String) stream[1];
                InputStream inputStream = stream[2];
                byte[] byteStream = inputStream.getBytes();

                ZipEntry zipEntry = new ZipEntry(fileName)
                out.putNextEntry(zipEntry);
                out.write(byteStream, 0, byteStream.length);
                out.closeEntry();
            }
        }

        out.close();

        response.setHeader("Content-Disposition", "attachment; filename=\"" + zipName + "\"");
        response.setHeader("Content-Type", "application/zip");
        response.getOutputStream().write(baos.toByteArray());
        response.flushBuffer();
        baos.close();

Merci à tous ceux qui ont aidé!

 5
Author: Brewster, 2018-03-22 08:38:00