27

我需要借助 node.js 获取文件的文件类型来设置内容类型。我知道我可以轻松检查文件扩展名,但我也有没有扩展名的文件,它们应该具有 content type image/pngtext/htmlaso。

这是我的代码(我知道它没有多大意义,但这是我需要的基础):

var http = require("http"),
    fs = require("fs");
http.createServer(function(req, res) {
    var data = "";
    try {
        /*
         * Do not use this code!
         * It's not async and it has a security issue.
         * The code style is also bad.
         */
        data = fs.readFileSync("/home/path/to/folder" + req.url);
        var type = "???"; // how to get the file type??
        res.writeHead(200, {"Content-Type": type});
    } catch(e) {
        data = "404 Not Found";
        res.writeHead(404, {"Content-Type": "text/plain"});
    }
    res.write(data);
    res.end();
}).listen(7000);

我还没有在API中找到一个函数,所以如果有人能告诉我怎么做,我会很高兴。

4

7 回答 7

39

有一个帮助库用于查找 mime 类型https://github.com/broofa/node-mime

var mime = require('mime');

mime.getType('/path/to/file.txt');         // => 'text/plain'

但它仍然使用扩展名进行查找

于 2012-05-03T13:05:06.947 回答
20

看看mmmagic 模块。它是一个 libmagic 绑定,似乎完全符合您的要求。

于 2012-05-03T13:06:20.723 回答
9

你应该看看命令行工具file(Linux)。它尝试根据文件的前几个字节猜测文件类型。您可以使用child_process.spawn从节点内运行它。

于 2012-05-03T12:58:53.870 回答
6

你想查找 mime 类型,幸好 node 有一个方便的库来做这件事:

https://github.com/bentomas/node-mime#readme

编辑:

您可能应该查看静态资产服务器,而不是自己设置任何这些东西。您可以使用express非常轻松地做到这一点,或者有一大堆静态文件模块,例如ecstatic。另一方面,您可能应该使用 nginx 来提供静态文件。

于 2012-05-03T13:02:43.970 回答
3

2018年解决方案

接受的答案似乎具有 Python 依赖项,而其他答案要么已过时,要么假定文件名具有某种扩展名。

请在此处找到我的最新答案

于 2018-12-06T11:34:08.620 回答
2

我用这个:

npm install mime-types

并且,在代码内部:

var mime = require('mime-types');
tmpImg.contentType = mime.lookup(fileImageTmp);

其中 fileImageTmp 是存储在文件系统上的图像副本(在本例中为 tmp)。

我可以看到的结果是:image/jpeg

于 2018-03-30T08:12:14.317 回答
0

我认为最好的方法是使用file系统的命令,这样你有三个优点:

  1. 没有依赖,
  2. 您将通过幻数确保文件具有的内容类型,
  3. 您将能够通过魔术文件创建内容类型。

例子:

let pathToFile = '/path/to/file';
const child_process = require('child_process');
child_process.exec(`"file" ${path}`, (err, res) => {
  let results = res.replace('\n', '').split(':');
  let stringPath = results[0].trim();
  let typeOfFile = results[1].trim();
  console.log(stringPath, typeOfFile);
});

文档: https ://www.man7.org/linux/man-pages/man1/file.1.html https://nodejs.org/docs/latest-v13.x/api/child_process.html#child_process_child_process_exec_command_options_callback

于 2021-04-14T12:36:37.127 回答