正常情况下,文件都是有后缀名的,例如:坤坤运球.gif, 坤坤跳舞.avi
但是也有无后缀名的文件。尝试着把 坤坤运球.gif 的文件后缀去掉,然后用图片查看器打开该文件,同样能看到坤坤精湛的球技。
正常情况下,文件都有后缀名,例如:坤坤运球.gif, 坤坤跳舞.avi。但也存在文件后缀名去掉的情况,虽然如此,去掉文件的后缀名,并不会影响文件本身的内容。所以在文件的数据中,有其他的方式能够标识出文件的类型。
这说明,改变文件的后缀名,并不会影响文件本身的内容。同时也说明,文件的数据中,有东西能够标识出文件的类型。
说以上那么多,其实是想引出 Magic Number 的概念。简单的来说,Magic Number 由文件数据中前几个字节组成, 同一类型的文件这几个字节都是一样的,故而可以标识出一个文件的类型。由于这串数字从字面上来看是无法理解的,故而称之为 Magic Number,原名叫做:File Signatures(文件签名),
例如,jpg 文件数字的十六进制形式是 ff d8 ff e0;而 gif 文件的十六进制形式是 47 49 46 38。
你可以用十六进制编辑器打开图片文件,然后对照数字表来确定文件类型。
Magic Number 在编程中有以下三类使用:
- 无法解释其意义的唯一值或者在程序中多次被引用但又可被命名常数所替代的值。
- 用来识别文本类型的一个常量数值或字符。
- 不易被误解为其他意义的特有值,如全局唯一标识符。
说了这么多,到底怎么用呢?
1、请求获取文件数据,并转成 Array Buffer
function loadFile(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
resolve(xhr)
}
}
xhr.onerror = reject
xhr.open('GET', url, true)
xhr.responseType = 'arraybuffer'
xhr.send('')
})
}
2、 buffer 转 16 进制字符串
function buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('')
}
3、根据 16 进制字符串获取文件头,判断文件类型
function getFileType(url) {
loadFile(url).then(xhr => {
const hex = buf2hex(xhr.response)
console.log(hex)
// todo....
})
}
常见文件头
JPEG (jpg),文件头:ffd8ff
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
html (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
mp3: 494433