Как установить тип контента на сервлете - PullRequest
9 голосов
/ 07 марта 2011

Я использую простой сервлет, который отправляет содержимое документа из базы данных в виде байтового массива. Я хотел бы установить содержимое type , чтобы оно имело соответствующее расширение во время его получения с помощью вызова doGet ().

У меня действительно есть тип документа, хранящийся в виде метаданных в базе данных (например, PNG, GIF, PNG, XLS, DOCX ...).

  1. Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?
  2. Файл загружается с именем «doc», как мне задать имя файла в сервлете для загружаемых данных.

Ответы [ 2 ]

12 голосов
/ 07 марта 2011

Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?

Используйте ServletContext#getMimeType(), чтобы получить тип пантомимы на основе имени файла.

String mimeType = getServletContext().getMimeType(filename);

Сервлет-контейнер обычно уже обеспечивает отображение типа MIME по умолчанию в своем собственном web.xml. Если вы хотите переопределить или добавить какой-либо другой объект, поместите его как новые сопоставления пантомимы в web.xml веб-приложения. Э.Г.

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

Наконец, установите его в качестве Content-Type заголовка ответа:

response.setContentType(mimeType);

Файл загружается с именем «doc», как мне задать имя файла в сервлете для загружаемых данных.

Добавьте его в URL сервлета, потому что некоторые браузеры, такие как MSIE, игнорируют атрибут filename в расположении содержимого.

<a href="download/filename.ext">download filename.ext</a>

Если сервлет сопоставлен с шаблоном URL-адреса /download/*, его можно получить следующим образом

String filename = request.getPathInfo().substring(1);

Наконец, установите его в заголовок Content-Disposition, чтобы сделать обычные браузеры счастливыми:

response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");

Если вы не храните имена файлов в БД, а скорее идентификаторы или что-то еще, используйте вместо этого имя файла.

<a href="download/${file.id}.${file.ext}">download ${file.id}.${file.ext}</a>

А потом в сервлете

String filename = request.getPathInfo().substring(1);
String id = filename.split("\\.")[0];
// Obtain from DB based on id.
8 голосов
/ 07 марта 2011
  1. Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?

Вы можете использовать метод объекта ответа setContentType, чтобы установить mime,Например:

response.setContentType("your-correct-mime-here");

2. Файл загружается с именем «doc», как мне задать имя файла в сервлете для загружаемых данных

Вы можете установить имя файла загружаемого файла, установив правильный заголовок.Вы можете использовать Content-Disposition, как показано ниже:

response.setHeader("Content-Disposition", "attachment; filename=\"" + your_file_name + "\"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...