【问题标题】:Error Creating zip file In Memory using Java使用 Java 在内存中创建 zip 文件时出错
【发布时间】:2012-03-06 22:54:30
【问题描述】:

这是我用来创建 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 是一个对象,其中包含有关文件的所有信息,包括实际文件。

关于我做错了什么有什么想法吗?我已经尝试了很多这种排列,但它们似乎都不起作用。提前谢谢你。

基思

【问题讨论】:

  • 一方面:当您遇到致命错误时,不要只打印堆栈跟踪。使请求失败。此外,不要抓住裸例外 - 这几乎总是错误的方法。哦,你为什么要在循环的每次迭代中设置标题?
  • Jon - 只是试着让一个快乐的线索工作,然后我会正确处理所有的异常,与标题相同;将它们放在循环中或外部不会改变错误。他们将被移出循环。
  • 但这让你很容易错过异常。 IMO,值得首先正确处理异常,这样你就可以知道你什么时候真正走上了幸福的道路......
  • 感谢您的反馈;知道为什么这不起作用吗?我知道异常处理不正确,但这不会影响该文件的正确创建和下载。

标签: java memory download zip zipoutputstream


【解决方案1】:

尝试使用带有 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 的参数。

注意这个方法不调用单参数的write方法 它的底层流带有单个参数 b。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 2016-09-23
    • 2014-06-30
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多