正常情况下,文件都有后缀名,例如:xxx.gif, xxxx.avi。但也存在文件后缀名去掉的情况,虽然如此,去掉文件的后缀名,并不会影响文件本身的内容。所以在文件的数据中,有其他的方式能够标识出文件的类型。7 F# Z" e7 q: K2 _* B! n* V& |
在编程中,把标识文件格式的常量称为 Magic Number, 原名叫做:File Signatures(文件签名)。
$ h4 a: k' F5 t$ u+ A; dMagic Number 在编程中有以下三类使用:9 z$ u. R5 C' ~
- 无法解释其意义的唯一值或者在程序中多次被引用但又可被命名常数所替代的值。
- 用来识别文本类型的一个常量数值或字符。
- 不易被误解为其他意义的特有值,如全局唯一标识符。
7 m6 _& m' g4 r6 h' n# r 利用 Magic Number 判断文件类型
1 a9 r* K, X+ |0 \/ N1、请求获取文件数据,并转成 Array Buffer
% r+ c/ W+ K/ J% ?. _* S% Cfunction 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 进制字符串
, W3 d' \6 e: Afunction buf2hex(buffer) {
return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('')
} 3、根据 16 进制字符串获取文件头,判断文件类型
$ F8 L/ z1 X& [, d% r) s# K/ Bfunction getFileType(url) {
loadFile(url).then(xhr => {
const hex = buf2hex(xhr.response)
console.log(hex)
// todo....
})
} 测试:
h8 F) I$ _; u3 J4 E7 X% B6 a
: \7 l/ f3 I$ M7 I ~; T% l常见文件头:
0 S& g. M+ A! x# L7 ? f
|