Сервлет отправляет изображение с сервера и сохраняет в клиенте - PullRequest
1 голос
/ 03 июня 2010

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

Из проведенных тестов я получаю эту ошибку: java.lang.IllegalStateException: getWriter () уже был вызван для этого ответа.

Как выполнить эту задачу, по вашему собственному мнению? Как сохранить на клиенте локально изображение?

Обновление

Спасибо за ответы. Моя проблема в том, что:

  1. изображение генерируется на сервере, но не для прямого запроса клиента (нет ссылки на нажатие на веб-страницу), изображение создается с использованием других служб в Интернете.
  2. реконструировать образ на сервере.
  3. Это изображение должно быть отправлено клиенту для локального сохранения.
  4. поэтому мне бы хотелось, чтобы появилось окно, в котором вы назначаете конечное изображение
  5. плюс, я бы хотел, чтобы остальные приложения не были затронуты этим действием.
  6. Приложение еще находится на производстве.

Большое спасибо за ваш ответ.

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Из проведенных тестов я получаю эту ошибку: java.lang.IllegalStateException: getWriter () уже был вызван для этого ответа.

Другими словами, вы пытались смешать двоичные данные изображения с символьными данными вывода HTML, или вы пытались сделать это в JSP вместо сервлета. Это действительно не сработает. Вам нужно отправить изображение или HTML-страницу исключительно в ответ на полностью отдельные запросы.

На вашей странице JSP / HTML просто есть ссылка на изображение, например:

<a href="imageservlet/filename.gif">click to download image</a>

Затем в сервлете, прослушивающем url-pattern из /imageservlet/*, вы просто получаете изображение как InputStream из некоторого источника данных (например, из локальной файловой системы диска как FileInputStream), а затем записываете его в OutputStream Ответ обычным способом Java IO.

Вам нужно всего лишь установить заголовок ответа Content-Disposition на attachment, чтобы клиент получил всплывающее диалоговое окно Сохранить как , иначе оно будет отображаться прямо в браузере. Установка Content-Type и Content-Length также важна, чтобы браузер знал, что отправляет сервер, и мог предсказать, сколько времени может занять загрузка.

response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "attachment;filename=\"" + file.getName() + "\"");

Вы можете найти полный базовый пример сервлета в этой статье .

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


Обновление : согласно вашему обновлению, есть два варианта:

  1. Вам нужно разрешить клиенту самому запустить два HTTP-запроса (я ответил на ваш следующий вопрос )

  2. Создайте приложение на стороне клиента, которое выполняет всю задачу непосредственно на стороне клиента, а затем вставьте его в свою веб-страницу, например, Java-апплет . С помощью апплета вы получаете полный контроль над клиентской средой. Вы можете выполнять почти весь Java-код, который хотите выполнить, и вы можете записывать файлы на диск напрямую, не спрашивая у клиента место для сохранения. Вам нужно только подписать апплет сторонней компанией, или клиент должен подтвердить предупреждение системы безопасности перед запуском.

1 голос
/ 03 июня 2010

Это зависит от браузера, как обрабатываются все типы вывода. Веб-страницы получают тип контента html, который браузер понимает и в конечном итоге отображает страницу, которую мы видим. Для изображений задан тип содержимого image / jpeg и т. Д., Которые отображаются в виде изображений на странице и т. Д. Чтобы вызвать запрос на загрузку, нужно использовать тип содержимого двоичного файла, а не изображения, поэтому браузер принудительно загружает чем показывает изображение. Чтобы убедиться в этом, используйте что-то вроде «application / octetstream» ... я не могу вспомнить точно, но его легко найти в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...