将生成的PDF(ByteArrayOutputStream)写入Servlet中的PrintWriter。
我正在拼命寻找将生成的PDF文件写入响应PrintWriter的方法。 由于过滤层次结构链已经调用了response.getWriter(),因此无法获得response.getOutputStream()。
我有一个生成PDF的ByteArrayOutputStream。现在我需要的是一种将此ByteArrayOutputStream的内容输出到PrintWriter的方法。如果有人能帮助我,我将非常感激!
答案 0 :(得分:7)
如果其他内容已经调用getWriter
,则可能已经在响应中写了一些文本。此外,PrintWriter
用于文本 - 您希望发送任意二进制数据... getOutputStream
绝对是前进之路,所以我会尝试找到已调用getWriter
的过滤器并修改它。
答案 1 :(得分:0)
你知道PrintWriter的编码是什么吗?如果它是Latin-1,你可以简单地将字节数组转换为Latin-1并写入PrintWriter,
String latin1 = byteStream.toString("ISO-8859-1");
response.getWriter().write(latin1);
当然,这假设过滤器实际上没有写任何东西。
答案 2 :(得分:0)
这是一个有点疯狂的想法,但我可能会这样解决它。
如果你真的无法触摸破碎的过滤器(真的吗?),请在破碎的过滤器之前写下另一个过滤器。
这看起来比它复杂,但这只是因为Java的冗长,所以请耐心等待。
它的作用基本上是它使用HttpServletResponseWrapper
来包装/“覆盖”过滤器中的response.getWriter()
以及链中跟随它的servlet。
因此,当您破坏的过滤器调用response.getWriter()
时,它将获得一个代理PrintWriter,它仅在第一次实际写入时调用真实的response.getWriter()
。
如果破坏的过滤器在没有写入的情况下调用response.getWriter()
,则不再重要。
我实际上没有测试过这段代码,但我相信它应该可行。
请注意,这假设破坏的过滤器调用response.getWriter()
而不实际写入内容。如果破碎的过滤器写了一些东西,然后你也试图写一个PDF,那么输出就会被破坏。
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
public class BrokenWriterGetterFixingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, final ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, new BrokenWriterGetterFixingResponseWrapper((HttpServletResponse) servletResponse));
}
@Override
public void destroy() {
}
private static class BrokenWriterGetterFixingResponseWrapper extends HttpServletResponseWrapper {
public BrokenWriterGetterFixingResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public PrintWriter getWriter() throws IOException {
return new PrintWriter(new BrokenWriterGetterFixingWriter(getResponse()));
}
}
private static class BrokenWriterGetterFixingWriter extends Writer {
private PrintWriter responseWriter;
private final ServletResponse response;
public BrokenWriterGetterFixingWriter(ServletResponse response) {
this.response = response;
}
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
getResponseWriter().write(cbuf, off, len);
}
@Override
public void flush() throws IOException {
getResponseWriter().flush();
}
@Override
public void close() throws IOException {
getResponseWriter().close();
}
private PrintWriter getResponseWriter() throws IOException {
if (null == responseWriter) {
responseWriter = response.getWriter();
}
return responseWriter;
}
}
}
答案 3 :(得分:-1)
我收到的错误如下:
此行下面没有错误错误500:java.lang.IllegalStateException:SRVE0199E:已经获得OutputStream
通过设置解决:
response.getOutputStream().write(bytes);
response.setContentLength(bytes.length);
现在输出变为:
此行以下没有任何内容