ByteArrayOutputStream 到 PrintWriter (Java Servlet)
将 Servlet 中生成的 PDF (ByteArrayOutputStream) 写入 PrintWriter。
我正在拼命寻找一种将生成的 PDF 文件写入响应 PrintWriter 的方法。 由于层次结构链上的过滤器已经调用了response.getWriter(),我无法获取response.getOutputStream()。
我确实有一个 ByteArrayOutputStream,我在其中生成了 PDF。现在我需要的是一种将该 ByteArrayOutputStream 的内容输出到 PrintWriter 的方法。如果有人能给我帮助,我将不胜感激!
Writing generated PDF (ByteArrayOutputStream) in a Servlet to PrintWriter.
I am desperately looking for a way to write a generated PDF file to the response PrintWriter.
Since a Filter up the hierarchy chain has already called response.getWriter() I can't get response.getOutputStream().
I do have a ByteArrayOutputStream where I generated the PDF into. Now all I need is a way to output the content of this ByteArrayOutputStream to the PrintWriter. If anyone could give me a helping hand would be very much appreciated!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你知道PrintWriter的编码是什么吗?如果是 Latin-1,您可以简单地将字节数组转换为 Latin-1 并写入 PrintWriter,
当然,这假设过滤器实际上没有写入任何内容。
Do you know what's the encoding of PrintWriter? If it's Latin-1, you can simply convert the byte array to Latin-1 and write to the PrintWriter,
Of course, this assumes the filter doesn't really write anything.
这是一个有点疯狂的想法,但我可能会这样解决。
如果您确实无法触及损坏的过滤器(真的吗?),请在损坏的过滤器之前编写另一个过滤器。
这看起来比实际情况更复杂,但这只是因为 Java 的冗长,所以请耐心等待。
基本上,它的作用是使用
HttpServletResponseWrapper
来包装/“覆盖”过滤器中的response.getWriter()
以及链中跟随它的 servlet。因此,当您损坏的 Filter 调用
response.getWriter()
时,它将获得一个代理 PrintWriter,该代理仅在第一次实际写入时调用真正的response.getWriter()
到。然后,如果损坏的 Filter 调用
response.getWriter()
而不对其进行写入,就不再重要了。我还没有实际测试过这段代码,但我相信它应该有效。
请注意,这假设损坏的 Filter 调用了
response.getWriter()
而没有实际写入任何内容。如果损坏的过滤器写入了一些内容,然后您又尝试向其中写入 PDF,那么输出无论如何都会损坏。Here's a somewhat crazy idea, but i would probably solve it like this.
If you really can't touch the broken Filter (really?), write another filter that you place before the broken Filter.
This looks more complex than it is, but that's only because of Java's verbosity, so please bear with me.
Basically what it does is that it uses
HttpServletResponseWrapper
to wrap/"override"response.getWriter()
in filters and the servlet following it in the chain.So when your broken Filter calls
response.getWriter()
, it will instead get a proxy PrintWriter that only calls the realresponse.getWriter()
the first time it is actually written to.Then it no longer matters if the broken Filter calls
response.getWriter()
without writing to it.I haven't actually tested this code, but i believe it should work.
Note that this assumes that the broken Filter calls
response.getWriter()
without actually writing something. The output would be corrupt anyway if the broken filter wrote something and then you tried to write a PDF to it as well.我收到如下错误:
此行下方没有任何内容错误 500:java.lang.IllegalStateException:SRVE0199E:OutputStream 已获得
通过设置解决:
现在输出变为:
此行下方没有任何内容
I was getting error like:
nothing below this lineError 500: java.lang.IllegalStateException: SRVE0199E: OutputStream already obtained
Solved by setting:
Now output becomes:
nothing below this line
如果其他东西已经调用了 getWriter,它很可能已经向响应写入了一些文本。此外,
PrintWriter
用于文本 - 您想发送任意二进制数据...getOutputStream
绝对是方法向前,所以我会尝试找到调用getWriter
的过滤器并修复它。If something else has already called
getWriter
, it may well have already written some text to the response. Besides,PrintWriter
is for text - you want to send arbitrary binary data...getOutputStream
is definitely the way forward, so I would try to find the filter which has calledgetWriter
and fix that instead.