Express:根据路径/文件设置内容类型?

mah*_*off 18 javascript connect node.js mime-types express

我知道Express有res.contentType()方法,但是如何根据路径/文件(包括静态内容)自动设置内容类型?

And*_*lau 37

此外,如果您想扩展表达(连接)所知道的mime类型,您可以这样做

express.static.mime.define({'text/plain': ['md']});
Run Code Online (Sandbox Code Playgroud)

要么

connect.static.mime.define({'text/plain': ['md']});
Run Code Online (Sandbox Code Playgroud)

PS:mime模块现在位于https://github.com/broofa/node-mime


Mic*_*ley 15

Express文档表明,如果你在文件名通过它可以做到这一点.

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

[编辑]

这是一个示例,它提供来自相关目录的文件,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);
Run Code Online (Sandbox Code Playgroud)

  • 我没有尽可能地解释它,但我的意思是使用express.static()提供静态内容.我看不出在哪里/如何配置这样的内容 - 它只是自动提供.即使是那些显式路由到位的人(比如编辑中),我认为可能会有某种中间件可能会自动注入内容类型,而不必在每条路径中明确地包含它. (4认同)

Pet*_*ons 8

Connect将自动设置内容类型,除非您自己明确设置.这是完成它的片段.它使用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 : ''));
}
Run Code Online (Sandbox Code Playgroud)

如果这不适合您,请发布您的代码,因为您的自定义代码可能会以某种方式干扰默认行为.

  • `mime.lookup()` 现在更名为 `mime.getType()`。 (3认同)

Tim*_*art 5

Express 使用 Connect,Connect 使用 Mime,Mime 包括文件mime.types(具有来自 Apache 的默认 mime 类型)和node.types(具有节点社区贡献的一些其他类型)。您可以在 node_modules 中的 mime 副本中自定义这些文件之一,以添加所需的内容类型,或者 Mime 也有一个 API,可让您指定要从代码加载的其他内容类型或 .types 文件。

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