2011-01-28 2 views
5

У меня есть Java webapp, создающий pdf-файл и передающий его обратно в браузер.Установить имя файла Pdf, который передается обратно в браузер

byte[] pdf = report.exportPdfToArray(user); 
response.setContentType("application/pdf"); 
response.setHeader("content-disposition", "inline; filename=\"My.pdf\""); 
outStream = response.getOutputStream(); 
outStream.write(pdf); 
outStream.flush(); 
outStream.close(); 

Отчет выполнен и он отправляется обратно в браузер, но я не могу контролировать имя файла, даже если я установить content-disposition. Я использую Jboss 4.2.1. Вы знаете, что мне не хватает?

EDIT: Есть ли способ установить имя файла, когда содержимое является встроенным?

+1

Некоторые браузеры, а именно IE6, иногда действуют смешно. Мне пришлось добавить что-то вроде: f =/myfile.pdf в конце строки запроса, чтобы он работал в IE6. – Spliffster

ответ

8

содержание-распоряжение: приложение ....

+0

Но я не хочу загружать файл. Я хочу отобразить его в браузере. – Atticus

+0

@Atticus: Я должен подтвердить, что у меня такая же проблема, добавьте, что она не работает с inline 'inline' (IE и Firefox) – Ralph

+0

В pdf-формате получено имя сервлета. Возможно, есть возможность задать заголовок страницы (в которой отображается pdf)? – Atticus

1

Я не могу обнаружить дефект. Вы проверяли поведение с другими браузерами/читателями?

По RFC, не определено, что клиент должен делать делать с информацией о имени файла, если он отображается рядный ...

+0

Еще хуже, RFC: отправитель может предложить использовать имя файла, если объект отсоединен и сохранен в отдельном файле. Если принимающий MUA записывает объект в файл, предлагаемое имя файла должно использоваться как основа для фактического имени файла, где это возможно. Важно, чтобы принимающий MUA не слепо использовал предложенное имя файла . Рекомендуемое имя файла ДОЛЖНО быть проверено (и, возможно, изменено), чтобы убедиться, что оно соответствует локальным соглашениям с файловой системой, не перезаписывает существующий файл и не представляет проблему безопасности ... – Ralph

+1

теперь существует ошибка в вышеупомянутой реализации но в различных версиях IE и как IE или плагин acrobat обрабатывают заголовки ответов HTTP. У меня не было проблем с другими браузерами. – Spliffster

-2

Существует обходной путь, чтобы сделать это. Мы можем использовать iframe, где iframe откроется на html-странице, iframe будет содержать отчет в формате pdf, тогда как html-страница не зависит от iframe. Мы можем редактировать заголовок html-страницы, содержащей iframe.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<html> 
    <head> 
     <title>${reportName}</title> 
    </head> 
    <body> 
     <iframe src="/fcWeb/ReportPDFServlet" width="100%" height="100%"></iframe> 
    </body> 
</html> 
+0

Здесь что-то не совсем написано о вашей разметке кода. Взгляните [на это руководство] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks), а затем отредактируйте свой ответ, чтобы исправить его, возможно? – Flexo

3

MSIE будет использовать последнюю часть информации о пути запроса URL (часть после последнего /) в качестве файла по умолчанию в Сохранить как действия. Он игнорирует атрибут filename заголовка Content-Disposition. Все остальные браузеры правильно относятся к этому заголовку.

Вам необходимо изменить шаблон URL вашего сервлета PDF на сопоставление маршрутов. То есть не используйте /pdf с http://example.com/context/pdf, но используйте /pdf/* с http://example.com/context/pdf/report.pdf. Таким образом, MSIE будет использовать «report.pdf» вместо «pdf» в качестве имени файла по умолчанию для действия Save As.

2

Я пробовал решение в java и работал.

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\""); 
response.setContentType("application/pdf; name=\"MyFile.pdf\""); 
response.getOutputStream().write(pdfAsBytesArray); 
0

Это странно, но это может быть полезным для кого-то (может быть, кто-то может сказать, что случилось с ним):

Когда я установил два заголовка, как:

response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size())); 
response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 

Это не Работа. Но когда я меняю порядок, он работает так, как ожидалось:

response.addHeader("Content-disposition", "attachment; filename=\"MyFileName.doc\""); 
response.addHeader("content-length", String.valueOf(((FileInputStream) is).getChannel().size()));