从JSP上的outputstream返回tiff文件
我使用JSP来显示单个TIFF文件。 流程如下:
- 我有一个PDF转换为TIFF。
- 我以File对象和OutputStream的forms提供PDF的“黑盒子”API(我目前正在使用ByteArrayOutputStream,但可以根据需要进行更改)。
- “黑匣子”将PDF转换为TIFF并将结果保存到OutputStream。
- 我使用out.println(outputstream)来吐出TIFF。
问题是我得到的是文本流而不是显示的图像。 我使用了以下head / meta标记:
PDF to TIFF tester
但这并没有改变最终结果。 有帮助吗?
你不应该为此使用JSP。 它是一种视图技术,提供基于文本的模板,将HTML / CSS / JS代码放入其中,并借助taglib(JSTL等)和EL(表达式语言, ${}
东西)与后端Java代码进行交互。
TIFF图像不是字符(文本)数据。 这是一个二进制数据。 你真的需要为此使用servlet。 您不应该使用Writer
方法来返回二进制数据。 您应该使用OutputStream
方法。 否则二进制数据将被破坏(这也是JSP中发生的事情,因为它在引擎盖下使用了Writer
)。
这是一个启动示例,您的servlet应如何:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pdfFilename = request.getParameter("filename"); File pdfFile = new File("/path/to/all/pdf/files", pdfFilename); response.setHeader("Content-Type", "image/tiff"); doYourThingToConvertPdfFileToTiff(pdfFile, response.getOutputStream()); }
将此servlet映射到例如/pdf2tiff
的url-pattern
上,以便您可以通过链接或浏览器地址栏中的http://example.com/contextname/pdf2tiff?filename=file.pdf
或甚至src
属性调用它。 元素。
doYourThingToConvertPdfFileToTiff
是你的“黑盒子”API,似乎已经将TIFF写入给定的OutputStream
。 只需使用它并通过HTTP响应之一。
更新 :如果您确实需要使用JSP,那么您可以在JSP中编写与在Servlet类中相同的代码。 你几乎可以将它复制。 只确保您没有将任何模板文本写入流中,这包括scriptlet外部的换行符和空格。 否则它也会被写入二进制文件并破坏它。
如果您有多个scriptlet块,则需要对它们进行排列,以便在scriptlet的结尾%>
和下一个scriptlet的起始<%
之间没有换行符。 因此,例如
<%@page import="java.io.File" %><% //... %>
代替
<%@page import="java.io.File" %> <% //... %>
这不行。 您需要对image / tiff的http响应的内容类型。
更多信息: http : //www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Response-Headers.html
元标记不是浏览器所看到的。 尝试使用scriptlet在响应对象上设置内容类型。 这个页面有一些建议。
如果必须使用JSP:
您可以将输出流存储到具有随机生成的名称的文件中,然后在JSP中引用该文件。 您需要确保输出目录位于Web服务器的路径中。
这也有它自己的问题:
- 您需要以删除旧文件的方式管理文件系统(因此您的服务器磁盘将填满)。
- 您需要管理文件的同步(没有两个服务器线程应该更新同一个文件)。
- 哦,你必须确保一个用户生成的图像不被另一个用户看到。
我见过很多人做过这种事情,我确信有一个图书馆。