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

后端 未结 6 1971
闹比i
闹比i 2020-12-09 16:46

I know Express has the res.contentType() method, but how to set automatically content type based on path/file (including static content)?

相关标签:
6条回答
  • 2020-12-09 17:02

    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);
    
    0 讨论(0)
  • 2020-12-09 17:03

    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

    0 讨论(0)
  • 2020-12-09 17:09

    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.

    0 讨论(0)
  • 2020-12-09 17:09

    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]
    

    0 讨论(0)
  • 2020-12-09 17:13

    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 讨论(0)
  • 2020-12-09 17:15

    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

    0 讨论(0)
提交回复
热议问题