使用Java在内存中创建zip文件时出错

时间:2012-03-06 22:54:31

标签: java memory download zip zipoutputstream

以下是我用来创建zip文件的代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream out = new ZipOutputStream(baos);
try {
    for(int i=0; i<docId.length; i++){
        BoxDotComDocumentManager docman = new BoxDotComDocumentManager();
        Document d = docman.get(docId[i]);
        ZipEntry entry = new ZipEntry(d.getFileName());
        entry.setSize(d.getFileBytes().length);
        out.putNextEntry(entry);
        out.write(d.getFileBytes());
        resp.setContentType("application/zip");
        resp.setHeader("Content-Disposition", "attachment; filename="+ "zipdemo.zip"); 
        out.closeEntry();
 }
 } catch (Exception e) {
      System.out.println("E = " + e);
 }
 try {
       resp.getOutputStream().write(baos.toByteArray());
   resp.flushBuffer();
} catch (IOException e) {
   e.printStackTrace();
    }
 finally {
baos.close();
out.close();
 }

将zip文件返回到要下载的浏览器,但是当我尝试下载文件时,我收到一条错误,指出由于zip文件无效而无法下载该文件。

Document是一个对象,它包含有关包含实际文件的文件的所有信息。

关于我做错了什么的任何想法?我已经尝试了很多这种排列,但它们似乎都没有效果。提前谢谢。

基思

1 个答案:

答案 0 :(得分:2)

尝试使用带有3个参数的out.write方法。

替换: out.write(d.getFileBytes());

使用: out.write(d.getFileBytes(),0,d.getFileBytes().length);


注意:根据java doc,带有一个参数的write方法无法读取。

  

将b.length个字节写入此输出流。

     

FilterOutputStream的write方法调用其write方法为3   带有参数b,0和b.length的参数。

     

请注意,此方法不会调用单参数的write方法   它的基础流有单个参数b。

在我自己的代码中进行此更改解决了我的问题。