wake-up-neo.com

Express: Inhaltstyp basierend auf Pfad/Datei einstellen?

Ich weiß, dass Express über die res.contentType () -Methode verfügt, aber wie wird der Inhaltstyp basierend auf dem Pfad/der Datei (einschließlich statischem Inhalt) automatisch festgelegt?

18
mahemoff

Connect setzt automatisch den Inhaltstyp, sofern Sie ihn nicht explizit festlegen. Hier ist der Ausschnitt, der es tut. Es verwendet mime.lookup und 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 : ''));
}

Wenn dies für Sie nicht funktioniert, veröffentlichen Sie Ihren Code, da Ihr benutzerdefinierter Code das Standardverhalten möglicherweise stört.

8
Peter Lyons

Wenn Sie die Mime-Typen erweitern möchten, die Express (connect) kennt, können Sie dies tun

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

oder

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

PS: Das Mime-Modul befindet sich jetzt unter https://github.com/broofa/node-mime

33
Andrei Neculau

Die Express-Dokumentation zeigt, dass dies möglich ist, wenn Sie den Dateinamen übergeben.

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

[Bearbeiten]

Hier ein Beispiel, das Dateien aus einem relativen Verzeichnis namens static bereitstellt und den Inhaltstyp automatisch anhand der bereitgestellten Datei festlegt:

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);
14
Michelle Tilley

Express verwendet Connect, Connect verwendet Mime und Mime enthält die Dateienmime.types(mit Standard-Mime-Typen von Apache) undnode.types(mit einigen weiteren Typen, die von der Knotengemeinschaft beigesteuert werden). Sie können einfach eine dieser Dateien in Ihrer mime-Kopie in node_modules anpassen, um den erforderlichen Inhaltstyp hinzuzufügen, oder Mime verfügt auch über eine API, mit der Sie zusätzliche Inhaltstypen oder .types-Dateien angeben können, die aus Ihrem Code geladen werden sollen.

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

4
Tim Stewart

Laden Sie diese Datenbank (oder ein anderer Link ) herunter: mime.types:, dann 

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


});

Dann, wenn Sie ein Beispiel haben, 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

Führen Sie den folgenden Befehl aus: 

npm install xmimetype ; 

Dann in Ihrem 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

Weitere Informationen finden Sie unter GIT-Repository .


Das Gegenteil ist verfügbar: 

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