繁体   English   中英

Java servlet 不写入响应字节

[英]Java servlet not writing response bytes

我有几个 Java servlet (3.x - Tomcat 8) 正在运行,用于生成和返回 PDF 文档。 我从来没有遇到过任何问题。 我最近编写了一个新的 servlet 来创建和返回一个 PDF 文档,这个新的 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 时,它返回 0 字节,即使上面的打印语句具有非零值。

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

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 容器关闭输出流,但文档中并不清楚。 如果发生异常,是否要关闭它是另一回事......

你真的应该冲洗并关闭bos而不是sos

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM