开发者

Express: Setting content-type based on path/file?

I know Express has the res.contentType() method, but how to set automatically content type based on p开发者_如何学编程ath/file (including static content)?


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 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.


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


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]


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' ]
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜