2010-05-13 55 views
0

我正在使用JSP来显示单个TIFF文件。流程如下:从JSP上的outputstream返回tiff文件

  1. 我给了一个PDF转换为TIFF。
  2. 我以File对象和OutputStream的形式提供了一个'黑匣子'API(我正在使用ByteArrayOutputStream,但可以根据需要进行更改)
  3. “黑匣子”将PDF转换为TIFF,并将结果保存到输出流。
  4. 我使用通过out.println(OutputStream中)吐出TIFF。

的问题是,我得到一个文本流,而不是显示图像的。我有使用以下头/元标签:

<head><title>PDF to TIFF tester</title> 
    <META HTTP-EQUIV="Content-Script-Type" CONTENT="image/tiff"></head> 
    <body> 

但是这并没有改变最终结果。任何帮助?

回答

0

这不会工作。您需要将http响应的内容类型映射到image/tiff。

富勒更多信息:http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Response-Headers.html

+0

尽管如此,这与我所处理的完全不同。一个JSP和一个Servlet是两个完全不同的东西。我无法在JSP上使用内联代码的响应对象。是否有另一种方法来设置响应类型? – YYY 2010-05-13 17:57:31

+0

像有人说过的,使用servlet – Midhat 2010-05-13 18:30:46

0

的meta标签是不是浏览器看什么。尝试使用scriptlet在响应对象上设置内容类型。这page有一些建议。

2

您不应该为此使用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上的url-pattern例如/pdf2tiff,这样就可以通过http://example.com/contextname/pdf2tiff?filename=file.pdf中的链接或浏览器地址栏,甚至在src调用它<img>元素的属性。

doYourThingToConvertPdfFileToTiff是你的“黑盒子”的API,它似乎已经写TIFF给定OutputStream。只要使用它并传递HTTP响应中的一个即可。


更新:如果你真的,真的需要使用JSP对于这一点,你可以只写在JSP相同的代码,你会在Servlet类来完成。你几乎可以复制粘贴它。只确保你是而不是将任何模板文本写入流中,这包括脚本之外的换行符和空白。否则,它会被写入二进制文件并损坏它。

如果您有多个scriptlet块,则需要对它们进行排列,以便scriptlet的结尾%>与下一个scriptlet的起始<%之间没有换行符。因此,例如

<%@page import="java.io.File" %><% 
    //... 
%> 

代替

<%@page import="java.io.File" %> 
<% 
    //... 
%> 
+0

我很乐意为此使用Servlet,但我的同事相当坚强,我不应该这样做。使用JSP的决定不是我自己的。顺便提一句,我找到了处理来自JSP第一行编码的方法; <%@ page language =“java”contentType =“image/tiff; charset = UTF-8”pageEncoding =“TIFF”%> 但是,这导致项目抱怨它不被支持,这是我的有点害怕看到整个时间。我认为这个问题可能会在我把这些发现发给我的同事时关闭。 – YYY 2010-05-13 18:19:59

+0

已被更新回答。顺便说一下,我希望你能洞悉你实际上应该用'OutputStream'做什么。不要将稍后按回的'ByteArrayOutputStream'传递到'InputStream'中,以便将它写入到响应的'OutputStream'中。这只是显而易见的低效率。你也真的不能'打印'OutputStream实例,你只能在响应中看到Object#toString()的结果。 – BalusC 2010-05-13 18:24:02

+0

这绝对是实现这一目标的最佳方式,它可以将PDF流式传输到客户端,因为它被光栅化(如果您的黑匣子支持它)。这可以节省内存。虽然请确保检查您的黑匣子是否即时进行光栅化,特别是如果您有大量的并发请求。 – Justin 2010-05-13 19:23:57

0

如果必须使用JSP:

可以输出流存储到一个随机生成的文件名的文件,然后引用文件在JSP中。您需要确保输出目录位于Web服务器的路径中。

这也有它自己的问题:

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

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