Express: Setting content-type based on path/file?
Also, if you want to extend the mime-types that express(connect) knows about, you can do
express.static.mime.define({'text/plain': ['md']});
or
connect.static.mime.define({'text/plain': ['md']});
PS: the mime module is now located at https://github.com/broofa/node-mime
The Express documentation shows that it can do this if you pass in the file name.
var filePath = 'path/to/image.png';res.contentType(path.basename(filePath));// Content-Type is now "image/png"
[Edit]
Here's an example which serves files from a relative directory called static
and automatically sets the content type based on the file served:
var express = require('express');var fs = require('fs');var app = express.createServer();app.get('/files/:file', function(req, res) { // Note: should use a stream here, instead of fs.readFile fs.readFile('./static/' + req.params.file, function(err, data) { if(err) { res.send("Oops! Couldn't find that file."); } else { // set the content type based on the file res.contentType(req.params.file); res.send(data); } res.end(); }); });app.listen(3000);
Connect will automatically set the content type, unless you explicitly set it yourself. Here's the snippet that does it. It uses mime.lookup and mime.charsets.lookup
// mime typetype = mime.lookup(path);//<SNIP>....// header fieldsif (!res.getHeader('content-type')) { var charset = mime.charsets.lookup(type); res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''));}
If this isn't working for you, post your code as your custom code is likely interfering with the default behavior somehow.