问题
I know Express has the res.contentType() method, but how to set automatically content type based on path/file (including static content)?
回答1:
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 type
type = mime.lookup(path);
//<SNIP>....
// header fields
if (!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.
回答2:
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
回答3:
The Express documentation shows that it can do this if you pass in the file name.
var filename = 'path/to/image.png';
res.contentType(filename);
// 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);
回答4:
Express uses Connect, Connect uses Mime, and Mime includes the files mime.types (with default mime types from Apache) and node.types (with some further types contributed by node community). You could just customize one of these files within your copy of mime in node_modules to add your required content type, or Mime also has an API that lets you specify additional content-types or .types files to load from your code.
https://github.com/broofa/node-mime
回答5:
Download this database (or Another link ) : mime.types: , then
var db_mimes=[],mime_ext=''
$.get('mime.types',{},function(d){
var lines=d.split('\n').filter(function(e){ /* filter which starts with #*/})
lines.forEach(function(line){
mime_ext=line.split(' ')
mime_ext[1].split(' ').forEach(function(ext){
db_mimes.push({e:ext,m:mime_ext[0]})
});
//create object for each line . i.e: {mime:'',extension}
});
});
Then if you have fo example var fname="myfile.png"
var extension=fname.substr((~-this.lastIndexOf(".") >>> 0) + 2) // get extension from name
var minme=db_mimes.filter(function(el){return el.e === extension})[0]
回答6:
Run the following cmd :
npm install xmimetype ;
Then , in your code :
var xm=require("xmimetype");
xm.mimetypeOf("java");
xm.mimetypeOf("./lib/Person.java");
// -> text/x-java-source
xm.mimetypeOf("docx");
xm.mimetypeOf("./lib/overview.docx");
// -> application/vnd.openxmlformats-officedocument.wordprocessingml.document
For more info , check GIT repository .
The opposite is available :
xm.extensionsOf("image/jpeg");
// -> [ 'jpeg', 'jpg', 'jpe' ]
来源:https://stackoverflow.com/questions/7109732/express-setting-content-type-based-on-path-file