JS 根据文件Magic Number判断文件是否是图片
原理:检测文件的 Magic Number
代码示例:
var pngMagic = [ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a ]; var jpeg_jfif = [ 0x4a, 0x46, 0x49, 0x46 ]; var jpeg_exif = [ 0x45, 0x78, 0x69, 0x66 ]; var jpegMagic = [ 0xFF, 0xD8, 0xFF, 0xE0 ]; var gifMagic0 = [ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 ]; var getGifMagic1 = [ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 ]; function arraycopy(src, index, dist, distIndex, size) { for (i = 0; i < size; i++) { dist[distIndex + i] = src[index + i] } } function arrayEquals(arr1, arr2) { console.log(arr1) console.log(arr2) if (arr1 == 'undefined' || arr2 == 'undefined') { return false } if (arr1 instanceof Array && arr2 instanceof Array) { if (arr1.length != arr2.length) { return false } for (i = 0; i < arr1.length; i++) { if (arr1[i] != arr2[i]) { return false } } return true } return false; } function isImage(buf) { if (buf == null || buf == 'undefined' || buf.length < 8) { return null; } var bytes = []; arraycopy(buf, 0, bytes, 0, 6); if (isGif(bytes)) { return "image/gif"; } bytes = []; arraycopy(buf, 6, bytes, 0, 4); if (isJpeg(bytes)) { return "image/jpeg"; } bytes = []; arraycopy(buf, 0, bytes, 0, 8); if (isPng(bytes)) { return "image/png"; } return null; } /** * @param data first 6 bytes of file * @return gif image file true,other false */ function isGif(data) { console.log('GIF') return arrayEquals(data, gifMagic0) || arrayEquals(data, getGifMagic1); } /** * @param data first 4 bytes of file * @return jpeg image file true,other false */ function isJpeg(data) { console.log('JPEG') return arrayEquals(data, jpegMagic) || arrayEquals(data, jpeg_jfif) || arrayEquals(data, jpeg_exif); } /** * @param data first 8 bytes of file * @return png image file true,other false */ function isPng(data) { console.log('PNG') return arrayEquals(data, pngMagic); }
HTML中使用示例
function handleFileSelect(evt) { var files = evt.target.files; if (files[0]) { var reader = new FileReader(); reader.onload = fileLoaded; //读取文件为ArrayBuffer reader.readAsArrayBuffer(files[0]); } } function fileLoaded(evt) { //取前11Bytes转换成Uint8Array var fileBuf = new Uint8Array(evt.target.result.slice(0, 11)); //调用之前的方法判断是不是图片 //如果不是返回null,否则返回mimeType var mime = isImage(fileBuf); alert(mime) } //对 input 注册change 事件监听 var fileInput = document.getElementById('file'); fileInput.addEventListener('change', handleFileSelect, false);
原文链接

作者:LiangSenCheng小森森 开源分享汇 公众号
出处:https://www.cnblogs.com/LiangSenCheng/p/17937954
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题或建议请联系作者,非常感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!