Je sais que Express utilise la méthode res.contentType (), mais comment définir automatiquement le type de contenu en fonction du chemin/fichier (y compris le contenu statique)?
Connect définira automatiquement le type de contenu, à moins que vous ne le définissiez explicitement vous-même. Voici l'extrait qui le fait. Il utilise mime.lookup et 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 : ''));
}
Si cela ne fonctionne pas pour vous, envoyez votre code, car votre code personnalisé interfère probablement avec le comportement par défaut.
En outre, si vous souhaitez étendre les types mime qui expriment (connect) sait, vous pouvez faire
express.static.mime.define({'text/plain': ['md']});
ou
connect.static.mime.define({'text/plain': ['md']});
PS: le module mime est maintenant situé à https://github.com/broofa/node-mime
La documentation Express montre qu'il peut le faire si vous transmettez le nom du fichier.
var filename = 'path/to/image.png';
res.contentType(filename);
// Content-Type is now "image/png"
[Modifier]
Voici un exemple qui sert les fichiers d'un répertoire relatif appelé static
et définit automatiquement le type de contenu en fonction du fichier servi:
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 utilise Connect, Connect utilise Mime et Mime inclut les fichiersmime.types(avec les types Mime par défaut d’Apache) etnode.types(avec quelques types supplémentaires fournis par la communauté de nœuds). Vous pouvez simplement personnaliser l'un de ces fichiers dans votre copie de mime dans node_modules pour ajouter le type de contenu requis. Mime dispose également d'une API qui vous permet de spécifier d'autres fichiers de type contenu ou .types à charger à partir de votre code.
Télécharger cette base de données (ou Un autre lien ): mime.types:, alors
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}
});
});
Alors si vous avez pour exemple 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]
Exécutez le cmd suivant:
npm install xmimetype ;
Ensuite, dans votre 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
Pour plus d'informations, consultez Référentiel GIT .
Le contraire est disponible:
xm.extensionsOf("image/jpeg");
// -> [ 'jpeg', 'jpg', 'jpe' ]