javascript检测内容改变了(JavaScript 检测文件的类型的方法)
javascript检测内容改变了
JavaScript 检测文件的类型的方法目录
- 一、如何查看图片的二进制数据
- 二、如何区分图片的类型
- 三、如何检测图片的类型
- 3.1 定义 readBuffer 函数
- 3.2 定义 check 函数
- 3.3 检测.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
我们会想到通过 input 元素的 accept 属性来限制上传的文件类型:
<input type="file" id="inputFile" accept="image.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
这种方案虽然可以满足大多数场景,但如果用户把.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
一、如何查看图片的二进制数据要查看图片对应的二进制数据,我们可以借助一些现成的编辑器,比如 Windows 平台下的 WinHex 或 macOS 平台下的 Synalyze It! Pro 十六进制编辑器。这里我们使用 Synalyze It! Pro 这个编辑器,以十六进制的形式来查看阿宝哥头像对应的二进制数据。
二、如何区分图片的类型计算机并不是通过图片的后缀名来区分不同的图片类型,而是通过 “魔数”(Magic Number)来区分。 对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型。
常见图片类型对应的魔数如下表所示:
文件类型
文件后缀
魔数
0xFF D8 FF
0x89 50 4E 47 0D 0A 1A 0A
0x47 49 46 38.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
0x42 4D
同样使用 Synalyze It! Pro 这个编辑器,来验证一下阿宝哥的头像(abao.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
由上图可知.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
很明显通过 文件后缀名或文件的 MIME 类型 并不能识别出正确的文件类型。接下来,阿宝哥将介绍在上传图片时,如何通过读取图片的二进制信息来确保正确的图片类型。
三、如何检测图片的类型3.1 定义 readBuffer 函数
在获取文件对象后,我们可以通过 FileReader API 来读取文件的内容。因为我们并不需要读取文件的完整信息,所以阿宝哥封装了一个 readBuffer 函数,用于读取文件中指定范围的二进制数据。
function readBuffer(file, start = 0, end = 2) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { resolve(reader.result); }; reader.onerror = reject; reader.readAsArrayBuffer(file.slice(start, end)); }); }
对于.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
3.2 定义 check 函数
为了实现逐字节比对并能够更好地实现复用,阿宝哥定义了一个 check 函数:
function check(headers) { return (buffers, options = { offset: 0 }) => headers.every( (header, index) => header === buffers[options.offset + index] ); }
3.3 检测.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
基于前面定义的 readBuffer 和 check 函数,我们就可以实现检测.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
3.3.1 html 代码
<li>
选择文件:<input type="file" id="inputFile" accept="image/*"
onchange="handleChange(event)" />
<p id="realFileType"></p>
</li>
3.3.2 JS 代码
const i.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
以上示例成功运行后,对应的检测结果如下图所示:
由上图可知,我们已经可以成功地检测出正确的图片格式。如果你要检测.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
然而,如果你要检测其他类型的文件,比如 PDF 文件的话,应该如何处理呢?这里我们先使用 Synalyze It! Pro 编辑器来浏览一下 PDF 文件的二进制内容:
const i.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
观察上图可知,PDF 文件的头 4 个字节的是 0x25 50 44 46,对应的字符串是 %PDF。为了让用户能更直观地辨别出检测的类型,阿宝哥定义了一个 stringToBytes 函数:
function stringToBytes(string) { return [...string].map((character) => character.charCodeAt(0)); }
基于 stringToBytes 函数,我们就可以很容易的定义一个 isPDF 函数,具体如下所示:
const isPDF = check(stringToBytes("%PDF"));
有了 isPDF 函数,你就实现 PDF 文件检测的功能了。但在实际工作中,遇到的文件类型是多种多样的,针对这种情形,你可以使用现成的第三库来实现文件检测的功能,比如 file-type 这个库。
其实基于文件的二进制数据,除了可以检测文件的类型之外,我们还可以读取文件相关的元信息,比如图片的尺寸、位深度、色彩类型和压缩算法等,我们继续以阿宝哥的头像(abao.jpg" alt="javascript检测内容改变了(JavaScript 检测文件的类型的方法)" border="0" />
好的,在前端如何检测文件类型就介绍到这里。在实际项目中,对于文件上传的场景,出于安全考虑,建议小伙伴们在开发过程中,都限制一下文件上传的类型。对于更严格的场景来说,就可以考虑使用阿宝哥介绍的方法来做文件类型的校验。
以上就是JavaScript 检测文件的类型的方法的详细内容,更多关于JavaScript 检测文件的类型的资料请关注开心学习网其它相关文章!
- js获取子表单所有数据(JavaScript实现异步提交表单数据)
- JavaScript实现网页版贪吃蛇游戏(JavaScript实现网页版贪吃蛇游戏)
- js实现继承的五种(JavaScript继承的三种方法实例)
- js怎么做一个计时器(JavaScript实现简单计时器)
- JavaScript命名空间
- JavaScript css3实现简单视频弹幕功能(JavaScript css3实现简单视频弹幕功能)
- js回调函数原理(关于JavaScript回调函数的深入理解)
- javascript如何操作文档元素(JavaScript操作元素实例大全)
- javascript怎么编写游戏(javaScript实现网页版的弹球游戏)
- javascript类型转换讲解(JavaScript数据类型转换详解推荐)
- JavaScript中call、apply、bind实现原理详解(JavaScript中call、apply、bind实现原理详解)
- ASP.NET使用JavaScriptSerializer实现序列化与反序列化
- html5 canvas 特效(JavaScript canvas实现流星特效)
- javascript取下拉框显示值(JavaScript offset实现鼠标坐标获取和窗口内模块拖动)
- js实现div(javascript拖曳互换div的位置实现示例)
- Javascript中apply、call、bind
- 朋友圈屏蔽你的人,可以直接看淡了(朋友圈屏蔽你的人)
- 金球奖只青睐那些会戴珠宝的女人(金球奖只青睐那些会戴珠宝的女人)
- 浙江省一个县,人口超40万,建县历史超1100年(浙江省一个县人口超40万)
- 五代十国南唐历代国君(五代十国南唐历代国君)
- 飞机引进工程师杨隆 匠人匠心,只争朝夕(飞机引进工程师杨隆)
- 三人行,她们是育人路上的 铁三角 团队(她们是育人路上的)
热门推荐
- 怎么用html做一个导航栏(html+css 实现简易导航栏功能)
- mysql limit越大越慢(MySQL limit分页大偏移量慢的原因及优化方案)
- python分析excel基础数据生成报表(Python实现定制自动化业务流量报表周报功能XlsxWriter模块)
- 如何去阿里云解析域名(利用Python+阿里云实现DDNS动态域名解析的方法)
- nginx过滤http请求协议(nginx对http请求处理的各个阶段详析)
- mysql8.0.15安装详细教程(mysql8.0.11数据目录迁移的实现)
- sqlserver中根据类型分组(SQL SERVER 分组求和sql语句)
- php redis配置(php+redis实现消息队列功能示例)
- 织梦dedecms优化安全设置指南(DeDecms SEO优化经验谈适用于任何网站)
- python柱状图第四节(python使用Plotly绘图工具绘制柱状图)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9