I’m developing a file upload with JSF. The application saves three dates about the file:
- Filename
- Bytes
- Content-Type as submitted by the browser.
My problem is that some files are saved with content type = application/octet-stream even if they are *.doc files oder *.pdf.
When does the browser submits such a content type?
I would like to clean up the database so I need to know when the browser information are incorrect.
Ignore the value sent by the browser. This is indeed dependent on the client platform, browser and configuration used.
If you want full control over content types based on the file extension, then better determine it yourself using
ServletContext#getMimeType().The default mime types are definied in the
web.xmlof the servletcontainer in question. In for example Tomcat, it’s located in/conf/web.xml. You can extend/override it in the webapp’s/WEB-INF/web.xmlas follows:You can also determine the mime type based on the actual file content (because the file extension may not per se be accurate, it can be fooled by the client), but this is a lot of work. Consider using a 3rd party library to do all the work. I’ve found JMimeMagic useful for this. You can use it as follows:
Note that it doesn’t support all mimetypes as reliable. You can also consider a combination of both approaches. E.g. if the one returns null or
application/octet-stream, use the other. Or if both returns a different but “valid” mimetype, prefer the one returned by JMimeMagic.Oh, I almost forgot to add, in JSF you can obtain the
ServletContextas follows:Or if you happen to use JSF 2.x already, use
ExternalContext#getMimeType()instead.