Express:基于path/文件设置内容types?

我知道Express有res.contentType()方法,但是如何根据path/文件(包括静态内容)自动设置内容types?

Connect会自动设置内容types,除非您自己明确设置。 这是它的代码片段。 它使用mime.lookup和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 : '')); } 

如果这不适合你,发布你的代码,因为你的自定义代码可能干扰默认行为。

另外,如果你想扩展expression(连接)知道的MIMEtypes,你可以这样做

 express.static.mime.define({'text/plain': ['md']}); 

要么

 connect.static.mime.define({'text/plain': ['md']}); 

PS:MIME模块现在位于https://github.com/broofa/node-mime

Express文档显示,如果您传入文件名,则可以执行此操作。

 var filename = 'path/to/image.png'; res.contentType(filename); // Content-Type is now "image/png" 

[编辑]

下面是一个示例,它提供了一个名为static的相对目录中的文件,并根据提供的文件自动设置内容types:

 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); 

Express使用Connect,Connect使用Mime,而Mime包含文件mime.types (使用来自Apache的默认MIMEtypes)和node.types (以及节点社区贡献的一些其他types)。 您可以在node_modules的mime副本中自定义其中一个文件,以添加所需的内容types,或者Mime还具有一个API,可让您指定其他内容types或.types文件以从您的代码加载。

https://github.com/broofa/node-mime

下载这个数据库 (或另一个链接 ):mime.types:,然后

  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 . ie: {mime:'',extension} }); }); 

那么如果你有例如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] 

运行以下cmd:

 npm install xmimetype ; 

然后,在你的代码中:

  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 

有关更多信息,请检查GIT存储库 。


相反的是可用的:

  xm.extensionsOf("image/jpeg"); // -> [ 'jpeg', 'jpg', 'jpe' ]