#java #file #struts
#java #файл #распорки
Вопрос:
Я пытаюсь загрузить PDF-файл в классе Struts Action. Проблема в том, что с помощью
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
Я хочу открыть окно «сохранить / открыть», но теперь содержимое PDF записывается в браузере:
пример.
%PDF-1.4 28 0 obj << /Type /XObject /Subtype /Image /Filter /DCTDecode /Length 7746 /Width 200 /Height 123 /BitsPerComponent 8 /ColorSpace /DeviceRGB >>...(cut)
Я пробовал этот код (ниже) в Chrome, Firefox и IE, и везде это одно и то же. Также я использовал для этого разные файлы PDF.
Мой фрагмент кода:
try {
URL fileUrl = new URL("file:///" filePath);
URLConnection connection = fileUrl.openConnection();
inputStream = connection.getInputStream();
int fileLength = connection.getContentLength();
byte[] outputStreamBytes = new byte[100000];
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
response.setContentLength(fileLength);
outputStream = response.getOutputStream();
int iR;
while ((iR = inputStream.read(outputStreamBytes)) > 0) {
outputStream.write(outputStreamBytes, 0, iR);
}
return null;
} catch (MalformedURLException e) {
logger.debug("service", "An error occured while creating URL object for url: "
filePath);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
} catch (IOException e) {
logger.debug("service", "An error occured while opening connection for url: "
filePath);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return null;
} finally {
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
inputStream.close();
}
return null;
Чего-то все еще не хватает?
Редактировать
Когда я использую этот код в классе Struts, он не работает, но когда я использую этот код в сервлете, он работает. Самое странное, что когда я в классе action пишу в сервлет только «response.sendRedirect()» (а вся логика находится в сервлете), это тоже не работает.
Когда я анализировал заголовки ответов, все в этих трех примерах было одинаковым.
Ответ №1:
Попробуйте изменить заголовок Content-Type на что-то, не распознаваемое браузером. Вместо
response.setContentType("application/pdf");
использовать
response.setContentType("application/x-download");
Это не позволит браузеру воздействовать на содержимое основного текста (что включает обработку содержимого плагинами) и заставит браузер отобразить диалоговое окно «Сохранить файл».
Кроме того, также может быть полезно проверить, необходимо ли наличие единственного пробела после точки с запятой в заголовке Content-Disposition для запуска требуемого поведения. Поэтому вместо следующей строки
response.setHeader("Content-Disposition", "attachment;filename=file.pdf");
вместо этого используйте следующее.
response.setHeader("Content-Disposition", "attachment; filename=file.pdf");
Комментарии:
1. Спасибо за ваш ответ. К сожалению, теперь все так, как было. Заголовок из firebug: вложение с размещением содержимого;имя файла=file.pdf-Тип содержимого application / x-загрузить содержимое-Длина 75312
2. @piotr0123456, я не понял вашего комментария. Но, предполагая, что это не сработало, вы можете попробовать предложение, которое я только что добавил.
3. Я изменил ContentType («приложение / pdf») на ContentType («приложение / x-download»), но это не сработало — как и раньше, я получаю содержимое (%PDF-1.4 28 0 obj …) в браузере. Я также добавил заголовок ответа после этого изменения (из firebug) Вложение с размещением содержимого; имя файла =file.pdf Тип содержимого application / x-загрузить содержимое-Длина 75312
4. @Piotr0123456, вы читали эти вики-страницы в Struts wiki — Обслуживающие PDF-документы и реализующие действие загрузки ?