我需要在node.js的帮助下获取文件的文件类型来设置内容类型。我知道我可以轻松检查文件扩展名,但我也有没有扩展名的文件,其内容类型应为image/png
,text/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中找不到相应功能,所以如果有人能告诉我怎么做,我会很高兴。
答案 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)
答案 5 :(得分:1)
我用过这个:
npm install mime-types
并且,在代码中:
var mime = require('mime-types');
tmpImg.contentType = mime.lookup(fileImageTmp);
其中fileImageTmp是存储在文件系统上的图像副本(在本例中为tmp)。
我可以看到的结果是: image / jpeg
答案 6 :(得分:0)
我认为最好的方法是使用系统的 file
命令,这样您就有三个优势:
示例:
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