Как установить тип контента на сервлете

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

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

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

2 ответа

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

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

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

Сервлет-контейнер обычно уже обеспечивает отображение MIME-типа по умолчанию в своем собственном web.xml, Если вы хотите переопределить или добавить какой-либо другой, то поместите его как новые отображения MIME в веб-приложения 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.
  1. Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?

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

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

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

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

response.setHeader("Content-Disposition", "attachment; filename=\"" + your_file_name + "\"");
Другие вопросы по тегам