Возврат файла TIFF из выходного потока на JSP - PullRequest
0 голосов
/ 13 мая 2010

Я использую JSP для отображения одного файла TIFF. Поток выглядит следующим образом:

  1. Мне дали PDF для преобразования в TIFF.
  2. Я передаю API «черного ящика» в формате PDF в виде объекта File и OutputStream (в настоящее время я использую ByteArrayOutputStream, но он может изменяться по мере необходимости.
  3. «Черный ящик» преобразует PDF в TIFF и сохраняет результат в OutputStream.
  4. Я использую out.println (outputtream), чтобы выплевывать TIFF.

Проблема в том, что я получаю текстовый поток вместо отображаемого изображения. Я использовал следующий заголовок / метатег:

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

Но это не меняет конечного результата. Любая помощь?

Ответы [ 4 ]

2 голосов
/ 13 мая 2010

Вы не должны использовать JSP для этого. Это технология представления, предоставляющая текстовый шаблон для размещения HTML / CSS / JS-кода и средства для взаимодействия с внутренним Java-кодом с помощью taglibs (JSTL и т. Д.) И EL (Expression Language, вещи ${}).

Изображение в формате TIFF не является символьными (текстовыми) данными. Это двоичные данные. Вам действительно нужно использовать сервлет для этого. Вы не должны использовать Writer методы для возврата двоичных данных. Вы должны использовать OutputStream методы для этого. В противном случае двоичные данные будут повреждены (это также происходит в JSP, так как он используется под капотом Writer).

Вот пример того, как должен выглядеть ваш сервлет:

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());
}

Сопоставьте этот сервлет с url-pattern, например, /pdf2tiff, чтобы его можно было вызвать с помощью http://example.com/contextname/pdf2tiff?filename=file.pdf в ссылках или адресной строке браузера или даже в атрибуте src элемента <img>.

doYourThingToConvertPdfFileToTiff - это ваш API "черного ящика", который, кажется, уже записывает TIFF в указанный OutputStream. Просто используйте его и передайте ответ HTTP.


Обновление : Если вам действительно нужно использовать JSP для этого, вы можете просто написать тот же код в JSP, что и в классе сервлетов. Вы можете практически скопировать его. Только убедитесь, что вы не записываете любой текст шаблона в поток, включая разрывы строк и пробелы за пределами скриптлетов. В противном случае он также будет записан в двоичный файл и испортит его.

Если у вас есть несколько блоков скриптлета, то вам нужно расположить их так, чтобы между окончанием %> скриплета и началом <% следующего скриплета не было разрыва строки. Так, например,

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

вместо

<%@page import="java.io.File" %>
<%
    //...
%>
0 голосов
/ 13 мая 2010

Если вы должны использовать JSP:

Вы можете сохранить выходной поток в файл со случайно сгенерированным именем, а затем сослаться на файл в JSP. Необходимо убедиться, что выходной каталог находится в пути веб-сервера.

Это также имеет свои проблемы:

  • Вам необходимо управлять файловой системой таким образом, чтобы удалять старые файлы (чтобы диск вашего сервера был заполнен).
  • Вам необходимо управлять синхронизацией с файлом (никакие два потока сервера не должны обновлять один и тот же файл).
  • Да, и вы должны убедиться, что изображения, созданные одним пользователем, не видны другому.

Я видел множество людей, занимающихся подобными вещами, я уверен, что есть библиотека.

0 голосов
/ 13 мая 2010

Метатег - это не то, на что смотрит браузер. Попробуйте использовать скриптлет для установки типа содержимого объекта ответа. На этой странице есть несколько предложений.

0 голосов
/ 13 мая 2010

Это не сработает. Вам нужен тип содержимого http ответа на изображение / tiff.

Fore больше информации: http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Response-Headers.html

...