Что я должен установить в качестве типа контента, чтобы он сохранял расширение файла?
Используйте 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.