从JSP上的outputstream返回tiff文件

我使用JSP来显示单个TIFF文件。 流程如下:

  1. 我有一个PDF转换为TIFF。
  2. 我以File对象和OutputStream的forms提供PDF的“黑盒子”API(我目前正在使用ByteArrayOutputStream,但可以根据需要进行更改)。
  3. “黑匣子”将PDF转换为TIFF并将结果保存到OutputStream。
  4. 我使用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映射到例如/pdf2tiffurl-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服务器的路径中。

这也有它自己的问题:

  • 您需要以删除旧文件的方式管理文件系统(因此您的服务器磁盘将填满)。
  • 您需要管理文件的同步(没有两个服务器线程应该更新同一个文件)。
  • 哦,你必须确保一个用户生成的图像不被另一个用户看到。

我见过很多人做过这种事情,我确信有一个图书馆。