Как указать тип содержимого ответа для документов, чтобы он работал согласованно в разных браузерах? - PullRequest
2 голосов
/ 11 февраля 2010

Я разрабатываю простой сервлет, который должен обслуживать документы через http. Я использую URL в виде / getDocument? FileId = 1234. Сервлет просто 1) устанавливает response.contentType и 2) записывает в response.outputStream.

Проблема заключается в правильной настройке типа контента, чтобы браузеры понимали ответ (т.е. отображали документ с использованием правильного приложения). В частности:

a) Для файлов PDF, если я установил тип содержимого «application / pdf», Internet Explorer понимает (немедленно отображает документ), а Firefox - нет (отображает пустую страницу без попытки открыть плагин для просмотра PDF). Если я установлю «application / x-octetstream», Firefox поймет это (правильно отобразит), но Internet Explorer скажет «неизвестный тип файла», когда попросит меня сохранить или открыть его.

b) Firefox понимает «application / msword» и «application / vnd.ms-excel», но Internet Explorer, как ни странно, не понимает, просто говорит «неизвестный тип файла».

Возможно ли, чтобы это работало согласованно во всех браузерах, и если да, то как правильно настроить тип содержимого для различных типов документов? Что-нибудь еще, что должно быть установлено в ответе, чтобы это работало правильно? Или, как я подозреваю, браузеры запутываются, когда URL не заканчивается соответствующим расширением имени файла? (т.е. getFile? fileId = 1234 вместо, например, getFile / test.pdf)

Ответы [ 2 ]

5 голосов
/ 11 февраля 2010

Внутри сервлета тип содержимого ответа должен быть установлен следующим образом:

response.setContentType(getServletContext().getMimeType(filenameWithExtension));

ServletContext#getMimeType() ищет все <mime-mapping> записи в web.xml для типов содержимого, связанных с определенными расширениями файлов. Все сопоставления по умолчанию можно найти в собственном web.xml сервера приложений (который, например, в Tomcat находится в /conf/web.xml). Может отсутствовать «новые» расширения файлов MSOffice OpenXML, такие как xlsx, docx и так далее. Вы можете добавить их в web.xml своего веб-приложения следующим образом:

<mime-mapping>
    <extension>xlsx</extension>
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>

Что касается того, как браузеры обрабатывают тип контента и связанное с ним приложение, главная проблема здесь - это MSIE. Он игнорирует заголовок Content-Type и параметр filename заголовка Content-Disposition. Вместо этого smartass-ingly угадывает тип содержимого на основе расширения файла в URL-адресе и использует последнюю информацию о пути URL-адреса в качестве имени файла. Поскольку вы использовали параметр запроса, например /getDocument?fileId=1234, вместо полноценного имени файла + расширения, имя файла станет getDocument, и MSIE не может надежно «угадать» его тип MIME. Вы действительно должны включить имя файла + расширение в URL, например, /getDocument/filename.ext. Вы можете получить эту часть в Servlet на request.getPathInfo(). Дополнительные подсказки сервлетов также см. В этой статье .

.

Что касается проблемы, связанной с тем, что Firefox неправильно обрабатывает файлы PDF, это должно быть неверной конфигурацией вашего Firefox. Попробуйте проверить, все ли выглядит правильно в Инструменты > Параметры > Приложения . Именно это должно уважать вышеупомянутые заголовки в правильной манере. Вы должны только убедиться, что любой заголовок Content-Length указан правильно (!!), иначе файл не может быть открыт.

0 голосов
/ 11 февраля 2010

Я бы порекомендовал проверить на втором компьютере, а также убедиться, что вы правильно установили Acrobat Reader (в Mozilla «about: plugins» возвращает вас в реестр плагинов).

...