web-dev-qa-db-fra.com

Express: Définition du type de contenu en fonction du chemin/fichier?

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)?

18
mahemoff

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.

8
Peter Lyons

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

33
Andrei Neculau

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

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.

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

4
Tim Stewart

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]

0
Abdennour TOUMI

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