0

这是我用来创建 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 文件无效,因此无法下载该文件。

文档是一个对象,其中包含有关文件的所有信息,包括实际文件。

关于我做错了什么的任何想法?我已经尝试了很多这种排列,但它们似乎都不起作用。先感谢您。

基思

4

1 回答 1

2

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

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

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


注意:根据 java 文档,只有一个参数的 write 方法不会被读取。

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

FilterOutputStream 的 write 方法调用其三个参数的 write 方法,参数为 b、0 和 b.length。

请注意,此方法不会使用单个参数 b 调用其基础流的单参数写入方法。

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

于 2012-03-23T17:28:35.893 回答