Экспресс: установка типа контента на основе пути / файла? - PullRequest
18 голосов
/ 18 августа 2011

Я знаю, что в Express есть метод res.contentType (), но как автоматически установить тип содержимого на основе пути / файла (включая статическое содержимое)?

Ответы [ 6 ]

35 голосов
/ 05 июля 2012

Кроме того, если вы хотите расширить mime-типы, о которых знает (подключить) MIME, вы можете сделать

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

или

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

PS: модуль MIMEсейчас находится по адресу https://github.com/broofa/node-mime

15 голосов
/ 19 августа 2011

Документация 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);
8 голосов
/ 20 августа 2011

Соединение автоматически установит тип содержимого, если вы сами не установили его явно.Вот фрагмент, который это делает.Он использует 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 : ''));
}

Если это не работает для вас, опубликуйте свой код, так как ваш пользовательский код, вероятно, каким-то образом мешает поведению по умолчанию.

4 голосов
/ 01 ноября 2011

Express использует Connect, Connect использует Mime, а Mime включает в себя файлы mime.types (с типами mime по умолчанию из Apache) и node.types (с некоторыми другими типами, предоставленными сообществом узлов). Вы можете просто настроить один из этих файлов в своей копии mime в node_modules, чтобы добавить требуемый тип контента, или Mime также имеет API, который позволяет вам указать дополнительные типы контента или файлы .types для загрузки из вашего кода.

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

0 голосов
/ 18 июня 2016

Запустите следующий 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 голосов
/ 12 ноября 2014

Загрузить эту базу данных (или Другая ссылка ): 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]

...