我在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分钟。