web-dev-qa-db-ja.com

Express:パス/ファイルに基づいてコンテンツタイプを設定しますか?

Expressにres.contentType()メソッドがあることを知っていますが、パス/ファイル(静的コンテンツを含む)に基づいてコンテンツタイプを自動的に設定する方法を教えてください。

19
mahemoff

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 : ''));
}

これでうまくいかない場合は、カスタムコードがデフォルトの動作を何らかの形で妨害している可能性があるため、コードを投稿してください。

8
Peter Lyons

また、express(connect)が認識しているMIMEタイプを拡張したい場合は、

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

または

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

PS:mimeモジュールは https://github.com/broofa/node-mime にあります。

35
Andrei Neculau

Expressドキュメント は、ファイル名を渡した場合にこれを実行できることを示しています。

var filename = 'path/to/image.png';
res.contentType(filename);
// 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);
15
Michelle Tilley

ExpressはConnectを使用し、ConnectはMimeを使用し、Mimeはファイルmime.typesを含めます(デフォルトのmime (Apacheからの型)とnode.types(いくつかの型はノードコミュニティによって提供されます)。 node_modulesのmimeのコピー内でこれらのファイルの1つをカスタマイズして、必要なコンテンツタイプを追加するか、Mimeには、コードからロードする追加のcontent-typesファイルまたは.typesファイルを指定できるAPIもあります。

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

4
Tim Stewart

これをダウンロード データベース (または 別のリンク ):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]

0
Abdennour TOUMI

次の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' ]
0
Abdennour TOUMI