簡體   English   中英

Express:根據路徑/文件設置內容類型?

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

我知道 Express 有 res.contentType() 方法,但是如何根據路徑/文件(包括靜態內容)自動設置內容類型?

另外,如果你想擴展 express(connect) 知道的 mime-types,你可以這樣做

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

或者

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

PS:mime 模塊現在位於https://github.com/broofa/node-mime

Express 文檔顯示,如果您傳入文件名,它可以執行此操作。

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

[編輯]

這是一個示例,它從名為static的相對目錄提供文件,並根據提供的文件自動設置內容類型:

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將自動設置內容類型,除非您自己明確設置。 這是執行此操作的代碼段。 它使用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 : ''));
}

如果這對您不起作用,請發布您的代碼,因為您的自定義代碼可能會以某種方式干擾默認行為。

Express 使用 Connect,Connect 使用 Mime,Mime 包括文件mime.types (具有來自 Apache 的默認 mime 類型)和node.types (具有節點社區貢獻的一些其他類型)。 您可以在 node_modules 中的 mime 副本中自定義這些文件之一以添加所需的內容類型,或者 Mime 也有一個 API,可讓您指定要從代碼加載的其他內容類型或 .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 . i.e: {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' ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM