PDF-файл отображается как «текст / HTML» в браузере - PullRequest
3 голосов
/ 20 октября 2011

Контекст: Apache перед сервером приложений Weblogic.

Пользователь может загрузить файл PDF через наше приложение J2EE.Только с Weblogic, PDF отображается правильно в плагине во всех браузерах.

Но в Apache заголовок ответа HTTP содержит Content-type "text/html" (как мы видим, например, в Firebug), что заставляет веб-браузер отображать файл в виде текста.То, что мы отправляем в заголовке HTTP из нашего Java-кода: Content-Disposition -> имя PDF и Expires -> 0

Не задан тип содержимого (для упрощения, скажем, мы не делаемзнать тип файла в нашем приложении), и мы не можем это изменить.

Кажется, что Apache отменяет это и устанавливает свой собственный Content-type, почему?Мы попытались установить DefaultType none в httpd.conf, но безрезультатно.

Конечно, это одинаково для всех типов файлов, PDF является только примером.

Есть идеи?

Ответы [ 3 ]

1 голос
/ 29 октября 2013

Я столкнулся с этой же проблемой вчера. В моем случае я обнаружил, что когда я (непреднамеренно) не устанавливал какое-либо значение Content-Type в HTTP-ответе от моего приложения WebLogic, Apache «услужливо» заметил бы это и установил заголовок Content-Type с text/html - несмотря на то, что содержимое, которое я возвращал клиенту, представляло собой двоичный файл PDF.

Это привело к тому, что необработанный двоичный контент PDF отображался в браузере клиента, как если бы он был простым текстом.

Может быть возможно подавить это поведение в Apache. Однако в моем случае решение, на котором я остановился, состояло в том, чтобы установить Content-Type для объекта ответа HTTP до принятия ответа.

(В моем приложении, приложении Oracle ATG Commerce, работающем в WebLogic, любые вызовы DynamoHttpServletResponse.setContentType() или DynamoHttpServletResponse.setHeader() после вызова flush() для outputStream объекта ответа молча игнорировались.)

0 голосов
/ 01 октября 2012

Может быть, модуль apache mime_magic помогает?

Если этого не произойдет, вы можете сохранить файл в некотором каталоге внутри www_root и отправить перенаправление в браузер, который ведет к этому файлу. Таким образом, только сам Apache отправляет файл обратно, и, используя mime_magic, он также может установить правильный тип содержимого.

0 голосов
/ 20 октября 2011

Почему вы не пытаетесь найти тип файла и заполнить тип содержимого. Любой другой способ будет нестандартным и может вызвать проблемы в зависимости от браузера.

Типы файлов могут быть определены с помощью

InputStream is = new BufferedInputStream(new FileInputStream(file));
mimeType = URLConnection.guessContentTypeFromStream(is);

или

String fileName = "/path/to/file";
MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap();

// only by file name
String mimeType = mimeTypesMap.getContentType(fileName);

// or by actual File instance
File file = new File(fileName);
mimeType = mimeTypesMap.getContentType(file);
...