【问题标题】:Return tiff file from outputstream on JSP从 JSP 上的输出流返回 tiff 文件
【发布时间】:2011-02-19 05:17:14
【问题描述】:

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

  1. 我收到了一个 PDF,可以转换为 TIFF。
  2. 我以 File 对象和 OutputStream 的形式向“黑盒”API 提供 PDF(我目前使用的是 ByteArrayOutputStream,但可以根据需要进行更改。
  3. “黑盒”将 PDF 转换为 TIFF 并将结果保存到 OutputStream。
  4. 我使用 out.println(outputstream) 吐出 TIFF。

问题是我得到的是文本流而不是显示的图像。我使用了以下头部/元标记:

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

但这不会改变最终结果。有什么帮助吗?

【问题讨论】:

    标签: java jsp tiff meta-tags


    【解决方案1】:

    您不应该为此使用 JSP。它是一种视图技术,提供基于文本的模板以将 HTML/CSS/JS 代码放入其中,并借助标记库(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 甚至在 &lt;img&gt; 元素的 src 属性中调用它。

    doYourThingToConvertPdfFileToTiff 是您的“黑匣子”API,它似乎已经将 TIFF 写入给定的OutputStream。只需利用它并传递 HTTP 响应之一即可。


    更新:如果您真的非常需要为此使用 JSP,您可以在 JSP 中编写与在 Servlet 类中相同的代码。您实际上可以复制粘贴它。只需确保您将任何模板文本写入流,这包括小脚本之外的换行符和空格。否则它也会被写入二进制文件并损坏它。

    如果您有多个 scriptlet 块,则需要对它们进行排列,以便在一个 scriptlet 的结尾 %&gt; 和下一个 scriptlet 的开头 &lt;% 之间没有换行符。因此,例如

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

    而不是

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

    【讨论】:

    • 我很想为此使用 Servlet,但我的同事一直坚持认为我不应该这样做。使用 JSP 的决定不是我自己的。顺便说一句,我从 JSP 的第一行找到了处理编码的方法; 但是,这导致项目抱怨它不支持,这是我有点害怕看到整个时间。我认为当我将这些发现带给我的同事时,这个问题可能会结束。
    • 更新了答案。顺便说一句,我希望您了解您应该如何使用OutputStream。不要将您按摩后的ByteArrayOutputStream 传递回InputStream 以将其写入响应的OutputStream。那只是效率低下。你也真的不能print() OutputStream 实例,你只会在响应中看到Object#toString() 的结果。
    • 这绝对是最好的方法,它可以在光栅化时将 PDF 流式传输到客户端(如果您的黑匣子支持它)。这可以节省内存。但请务必检查您的黑盒是否即时进行光栅化,尤其是在您有大量并发请求的情况下。
    【解决方案2】:

    这行不通。你需要对image/tiff的http响应的内容类型。

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

    【讨论】:

    • 不过,这与我正在处理的设置完全不同。 JSP 和 Servlet 是两个完全不同的东西。我不能在 JSP 上使用带有内联代码的响应对象。还有其他方法可以设置响应类型吗?
    • 就像有人说的,使用 servlet
    【解决方案3】:

    元标记不是浏览器所看到的。尝试使用 scriptlet 设置响应对象的内容类型。这个page 有一些建议。

    【讨论】:

      【解决方案4】:

      如果您必须使用 JSP:

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

      这也有其自身的问题:

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-28
        • 1970-01-01
        • 2023-03-16
        • 2011-06-17
        • 2012-06-13
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多