Установить имя файла PDF, который передается обратно в браузер - PullRequest
7 голосов
/ 28 января 2011

У меня есть веб-приложение на Java, создающее файл 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. Вы знаете, что мне не хватает?

РЕДАКТИРОВАТЬ : Так есть ли способ установить имя файла, когда расположение содержимого встроено?

Ответы [ 6 ]

8 голосов
/ 28 января 2011

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

3 голосов
/ 22 октября 2011

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» в качестве имени по умолчанию для Сохранить как действие.

2 голосов
/ 02 июля 2015

Я пробовал решение в Java, и оно сработало.

response.setHeader("Content-Disposition","inline; filename=\"MyFile.pdf\"");
response.setContentType("application/pdf; name=\"MyFile.pdf\"");
response.getOutputStream().write(pdfAsBytesArray);
1 голос
/ 28 января 2011

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

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

0 голосов
/ 30 марта 2017

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

Когда я устанавливаю два заголовка, например:

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()));
0 голосов
/ 22 октября 2011

Для этого есть обходной путь.Мы можем использовать 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>
...