Из проведенных тестов я получаю эту ошибку: 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() + "\"");
Вы можете найти полный базовый пример сервлета в этой статье .
Примечание: вы не можете контролировать, где клиент будет сохранять изображение, это будет дыра в безопасности. Таким образом, веб-сайты смогут беззаботно записывать вредоносные файлы на клиентский диск.
Обновление : согласно вашему обновлению, есть два варианта:
Вам нужно разрешить клиенту самому запустить два HTTP-запроса (я ответил на ваш следующий вопрос )
Создайте приложение на стороне клиента, которое выполняет всю задачу непосредственно на стороне клиента, а затем вставьте его в свою веб-страницу, например, Java-апплет . С помощью апплета вы получаете полный контроль над клиентской средой. Вы можете выполнять почти весь Java-код, который хотите выполнить, и вы можете записывать файлы на диск напрямую, не спрашивая у клиента место для сохранения. Вам нужно только подписать апплет сторонней компанией, или клиент должен подтвердить предупреждение системы безопасности перед запуском.