Cirry's Blog

nodejs获取文件类型

2024-04-11
技术
最后更新:2024-04-23
4分钟
730字

问题

最近在开发文件服务器,遇到了一个问题,需要获取文件的信息,来判断文件是否可以预览。

比如如果获取到了png、jpg格式的文件就以图片预览的方式打开,遇到了txt、js这样的文件就以文本的信息打开预览,遇到了zip、ttf类型格式的文件就不允许预览。

后缀名数量很多,如果一一判断的话是很复杂的且会遗漏,还有很多文件可能没有后缀名,比如jpg格式的图片没有jpg后缀名也是可以预览的,在linux中的很多文件中也可以不设置后缀名。

所以需要来解决这个问题。

解决

方式一:file-type

使用file-type来解决这个问题。

这里有一个大坑,我花了两个小时才发现这个问题,就是这个包是有很多文件是识别不出来的。

虽然他是根据magic number 来获取的,比直接判断后缀名会准备很多,但是有很多类型都是缺失的。

我在测试的时候,只使用了txt和js文件结尾的,结果总是返回undefined,以为是版本问题,路径问题等等进行调整,最后发现这两个就是读取不出来才返回undefined。

后续又进行了一些测试,发现奇怪的文件都无法读取出来,常用的很多都能读出来。

1
npm install file-type@16.5
1
const FileType = require('file-type');
2
3
(async () => {
4
console.log(await FileType.fromFile(join(__dirname, 'public', 'test.txt')));
5
})(); // undefined
6
7
(async () => {
8
console.log(await FileType.fromFile(join(__dirname, 'public', 'archive.zip')));
9
})(); // { ext: 'zip', mime: 'application/zip' }

方式二:mime

后来为了每一个文件类型都可以正常展示,改为简单的使用mime来获取了。

1
npm install mime@3
1
const mime = require('mime')
2
mime.getType('text') // text/plain
3
mime.getType('php') // application/x-httpd-php
4
mime.getExtension('text/plain') // 'txt'

思考

如果你只需要简单的根据后缀名来获取文件类型的话,建议使用mime,这个还是比较全面的。

本意是想避免后缀名来保证文件获取的准确性,后来发现文件类型太多太杂,最简单的办法还是根据后缀名作为第一判断要素,后缀名失效的情况下再根据读取文件来判断。

但是后缀名都失效了,一个文件如果是一个奇怪的后缀名或者没有后缀名,这玩意也是大概率也是预览不了的,感觉不需要再做多余的处理了。

所以最后我选择了mime的方式来根据简单的后缀名判断文件类型。比如或者到image/png,只要是以image开头的都默认为图片类型,然后在其中筛选只要少部分的内容可以在网页中预览。

包括视频也是如此,虽然视频格式有很多种,但是能在网页中预览的没几种。

本文标题:nodejs获取文件类型
文章作者:Cirry
发布时间:2024-04-11
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode