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?
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.
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
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);
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.
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]
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' ]