Как установить тип контента на сервлете
Я использую простой сервлет, который отправляет содержимое документа из базы данных в виде байтового массива. Я хотел бы установить тип содержимого таким образом, чтобы он имел соответствующее расширение во время его получения с помощью вызова doGet().
У меня есть тип документа, хранящегося в виде метаданных в базе данных (например, PNG, GIF, PNG, XLS, DOCX...).
- Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?
- Файл загружается с именем "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.
- Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?
Вы можете использовать метод setContentType объекта ответа, чтобы установить mime. например:
response.setContentType("your-correct-mime-here");
2. Файл загружается с именем "doc", как мне установить имя файла на сервлете для загружаемых данных
Вы можете установить имя файла загружаемого файла, установив правильный заголовок. Вы можете использовать Content-Disposition, как показано ниже:
response.setHeader("Content-Disposition", "attachment; filename=\"" + your_file_name + "\"");