Java servlet 不写入响应字节

标签 java tomcat servlets

我运行了一些 Java servlet (3.x - Tomcat 8),用于生成和返回 PDF 文档。我对它们中的任何一个都没有遇到过任何问题。我最近编写了一个新的 servlet 来创建和返回 PDF 文档,并且这个新的 servlet 使用与其他 servlet 完全相同的响应代码:

response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition","attachment; filename=\""+filename+".pdf\""); 
response.setContentLength(pdfBytes.length);

System.out.println("# Bytes => " + pdfBytes.length);

ServletOutputStream sos = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(sos);
bos.write(pdfBytes);
sos.flush();
sos.close();

正如我所说,这与其他 servlet 一起工作得很好,但是当我调用新的 servlet 时,它返回 0 字节,即使上面的 print 语句具有非零值。

但是,如果我将上面的响应写入代码更改为:

OutputStream os = response.getOutputStream();
os.write(pdfBytes);
os.flush();
os.close();

...它工作正常,返回格式良好的 PDF 文档。为什么会发生这种情况?

最佳答案

您没有刷新 BufferedOutputStream - 因此它正在缓冲您的所有数据。您应该刷新那个,而不是ServletOutputStream

但是,如果您只编写单个字节数组,则无论如何使用 BufferedOutputStream 都是没有意义的 - 并且您无论如何都不需要显式刷新,因为关闭将会刷新。所以你只需要:

ServletOutputStream sos = response.getOutputStream();
sos.write(pdfBytes);
// Unclear whether *this* is needed, either.
sos.close();

我个人期望 servlet 容器关闭输出流,但文档中并不清楚。如果发生异常是否要关闭它是另一回事......

关于Java servlet 不写入响应字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60293682/

相关文章:

maven - Cargo Maven Tomcat NoInitialContextException 当我已经有了 Context

java - 如何将 1D 数组转换为 3D 数组?

java - 创建单例管理器时无法对非静态字段进行静态引用

java - Jetty SslConnector 的弃用方法

Java、Tomcat : AN invalid character was present in the cookie value

tomcat - 部署 Grails 应用程序时出错 : java. lang.NoClassDefFoundError: org/codehaus/groovy/runtime/BytecodeInterface8

Java Servlet - 下载并转发到页面

jsp - 是否可以在每个 session 中仅评估 JSP 一次,然后将其缓存?

java - Servlets 通过 setHeaders() 返回信息

java - 使用 lambda 表达式从对象列表中选择对象