通过HttpResponse下载Zip文件Java

问题描述:

因此,我从数据库(各种mimetypes)抓取了一组blob,并试图将它们压缩成由用户通过http响应下载。我可以让下载发生,但是当我尝试打开下载的zip文件时,它会显示“存档文件格式未知或已损坏。”我尝试了下面的代码,使用application/zip,application/octet-stream和application/x-zip-compressed,但我开始认为问题在于我如何添加文件。我也在使用Java 7和Grails 2.2.4。通过HttpResponse下载Zip文件Java

任何帮助,这将不胜感激。谢谢!

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(); 
+0

这似乎或多或少好,至少你写文件的方式应该工作。你有没有试过运行这段代码,让它将文件保存到磁盘,看看你是否可以打开它,然后通过电线发送。 –

+0

@ ShaunStone感谢您回复Shaun。我直接将它下载到我的电脑上,我可以毫无问题地打开它。我想这意味着问题在于我将其推入响应的方式? – Brewster

我在这里找到了答案:Returning ZipOutputStream to browser

好吧,那又怎样结束了工作对我来说是转换ZipOutputStream到一个ByteArrayOutputStream并将其写入为一个byte []回应:

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

感谢大家帮助!

+0

您可以将自己的答案标记为正确答案,以获得徽章:) – manuna

+0

感谢您的回答,它为我节省了很多头痛! – JJT