I am using a simple servlet which sends back document contents from the database as a byte array. I would like to set a content type so that it has an appropriate extension while it is being retrieved via a doGet() call.
I do have the type of the document stored as a metadata in the database (e.g. png, gif, png, xls, docx ...).
What should I set as the content type so that it retains the file extension?
Use ServletContext#getMimeType()
to get the mime type based on the file name.
String mimeType = getServletContext().getMimeType(filename);
The servletcontainer usually already provides a default mime type mapping in its own web.xml
. If you want to overridde or add some other, then put it as new mime mappings in webapp's web.xml
. E.g.
<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>
Finally set it as the Content-Type
response header:
response.setContentType(mimeType);
The file gets downloaded with a name of "doc", how do I set the filename on the servlet for the data being downloaded.
Add it to the servlet URL because some browsers like MSIE ignores the filename
attribute of the content disposition.
<a href="download/filename.ext">download filename.ext</a>
If the servlet is mapped on an URL pattern of /download/*
, then you can obtain it as follows
String filename = request.getPathInfo().substring(1);
Finally set it in the Content-Disposition
header as well to make normal browsers happy:
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
If you don't store filenames in DB but rather IDs or something, then use it as filename instead.
<a href="download/${file.id}.${file.ext}">download ${file.id}.${file.ext}</a>
And then in the servlet
String filename = request.getPathInfo().substring(1);
String id = filename.split("\\.")[0];
// Obtain from DB based on id.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With