问题
最近在开发文件服务器,遇到了一个问题,需要获取文件的信息,来判断文件是否可以预览。
比如如果获取到了png、jpg格式的文件就以图片预览的方式打开,遇到了txt、js这样的文件就以文本的信息打开预览,遇到了zip、ttf类型格式的文件就不允许预览。
后缀名数量很多,如果一一判断的话是很复杂的且会遗漏,还有很多文件可能没有后缀名,比如jpg格式的图片没有jpg后缀名也是可以预览的,在linux中的很多文件中也可以不设置后缀名。
所以需要来解决这个问题。
解决
方式一:file-type
使用file-type来解决这个问题。
这里有一个大坑,我花了两个小时才发现这个问题,就是这个包是有很多文件是识别不出来的。
虽然他是根据magic number 来获取的,比直接判断后缀名会准备很多,但是有很多类型都是缺失的。
我在测试的时候,只使用了txt和js文件结尾的,结果总是返回undefined,以为是版本问题,路径问题等等进行调整,最后发现这两个就是读取不出来才返回undefined。
后续又进行了一些测试,发现奇怪的文件都无法读取出来,常用的很多都能读出来。
方式二:mime
后来为了每一个文件类型都可以正常展示,改为简单的使用mime
来获取了。
思考
如果你只需要简单的根据后缀名来获取文件类型的话,建议使用mime,这个还是比较全面的。
本意是想避免后缀名来保证文件获取的准确性,后来发现文件类型太多太杂,最简单的办法还是根据后缀名作为第一判断要素,后缀名失效的情况下再根据读取文件来判断。
但是后缀名都失效了,一个文件如果是一个奇怪的后缀名或者没有后缀名,这玩意也是大概率也是预览不了的,感觉不需要再做多余的处理了。
所以最后我选择了mime
的方式来根据简单的后缀名判断文件类型。比如或者到image/png
,只要是以image
开头的都默认为图片类型,然后在其中筛选只要少部分的内容可以在网页中预览。
包括视频也是如此,虽然视频格式有很多种,但是能在网页中预览的没几种。