Node.js - 文件系统获取文件类型,解决方案大约在2012年

时间:2012-05-03 12:55:50

标签: javascript node.js filesystems file-type

我需要在node.js的帮助下获取文件的文件类型来设置内容类型。我知道我可以轻松检查文件扩展名,但我也有没有扩展名的文件,其内容类型应为image/pngtext/html aso。

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

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中找不到相应功能,所以如果有人能告诉我怎么做,我会很高兴。

7 个答案:

答案 0 :(得分:30)

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

var mime = require('mime');

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

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

答案 1 :(得分:18)

查看mmmagic module。这是一种libmagic绑定,似乎完全符合你的要求。

答案 2 :(得分:9)

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

答案 3 :(得分:6)

你想要查找mime类型,谢天谢地,node有一个方便的库:

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

编辑:

您应该查看静态资产服务器,而不是自己设置任何这些内容。您可以使用express来轻松地执行此操作,或者使用大量静态文件模块,例如: ecstatic。另一方面,你应该使用nginx来提供静态文件。

答案 4 :(得分:2)

2018解决方案

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

请找到我最新的答案here

答案 5 :(得分:1)

我用过这个:

npm install mime-types

并且,在代码中:

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

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

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

答案 6 :(得分: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