无法写入HttpServletResponse ServletOutputStream

时间:2018-03-06 21:10:30

标签: spring-mvc pdf tomcat8 outputstream broken-pipe

我在Tomcat 8.5上运行一个Spring应用程序,它查询我们的数据库,生成一个PDF文件,然后通过ServletOutputStream将它提供给用户:

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    //PDDocument from org.apache.pdfbox.pdmodel
    this.document.save(byteArrayOutputStream);
    int pdfDocumentSize = byteArrayOutputStream.size();

    response.setContentLength(pdfDocumentSize);

    ServletOutputStream resOutputStream = response.getOutputStream();

    byteArrayOutputStream.writeTo(resOutputStream);
    response.flushBuffer();

    byteArrayOutputStream.close();
    resOutputStream.close();
    this.document.close();

对绝大多数用户来说,这很好用。但是,我们收到的报告称,有些用户在下载此文件时遇到了很多麻烦。他们点击下载链接,页面在崩溃前停留约3分钟(他们收到ERR_EMPTY_RESPONSE消息)。有时,在此等待期后文件会正常打开。

不幸的是,我们个人无法复制此问题。

根据我们的日志,文件生成正确。文件大小相对较小(105631字节,或大约.1MB),所以我不认为它是由于大小。日志似乎也表明文件已正确创建。

日志还会显示

    org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

通常表示用户中止了下载。但是,我们看到用户通过截屏播放复制此问题,并且没有采取任何会中止的操作。这个用户也在MAC上。我们没有在这里测试任何MAC,但我们有一台iPad。 iPad也能成功下载文件。

可能导致这种情况的原因是什么?

更新:我们从其他用户那里听说他们也遇到了这个问题。它们位于Windows操作系统上并使用Chrome。已尝试过不同的浏览器,但它们的行为都相同。

此外,日志中生成的异常比报告错误的时间晚10分钟。

0 个答案:

没有答案