iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript怎么检测文件的类型
  • 595
分享到

JavaScript怎么检测文件的类型

2023-06-15 14:06:11 595人浏览 薄情痞子
摘要

这篇文章主要介绍javascript怎么检测文件的类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式

这篇文章主要介绍javascript怎么检测文件的类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式的图片。针对这个问题,我们会想到通过  input 元素的 accept 属性来限制上传的文件类型:

<input type="file" id="inputFile" accept="image/png" />

这种方案虽然可以满足大多数场景,但如果用户把 JPEG 格式的图片后缀名更改为 .png  的话,就可以成功突破这个限制。那么应该如何解决这个问题呢?其实我们可以通过读取文件的二进制数据来识别正确的文件类型。在介绍具体的实现方案前,阿宝哥先以图片类型的文件为例,来介绍一下相关的知识。

一、如何查看图片的二进制数据

要查看图片对应的二进制数据,我们可以借助一些现成的编辑器,比如 windows 平台下的 WinHex 或 MacOS 平台下的 Synalyze It!  Pro 十六进制编辑器。这里我们使用 Synalyze It! Pro 这个编辑器,以十六进制的形式来查看阿宝哥头像对应的二进制数据。

JavaScript怎么检测文件的类型

二、如何区分图片的类型

计算机并不是通过图片的后缀名来区分不同的图片类型,而是通过 “魔数”(Magic Number)来区分。  对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型。

常见图片类型对应的魔数如下表所示:

文件类型文件后缀魔数
JPEGjpg/jpeg0xFF D8 FF
PNGpng0x89 50 4E 47 0D 0A 1A 0A
GIFgif0x47 49 46 38(GIF8)
BMPbmp0x42 4D

同样使用 Synalyze It! Pro 这个编辑器,来验证一下阿宝哥的头像(abao.png)的类型是否正确:

JavaScript怎么检测文件的类型

由上图可知,PNG 类型的图片前 8 个字节是 0x89 50 4E 47 0D 0A 1A 0A。当你把 abao.png 文件修改为  abao.jpeg 后,再用编辑器打开查看图片的二进制内容,你会发现文件的前 8 个字节还是保持不变。但如果使用 input[type="file"]  输入框的方式来读取文件信息的话,将会输出以下结果:

JavaScript怎么检测文件的类型

很明显通过 文件后缀名或文件的 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));   }); }

对于 PNG 类型的图片来说,该文件的前 8 个字节是 0x89 50 4E 47 0D 0A 1A 0A。因此,我们在检测已选择的文件是否为 PNG  类型的图片时,只需要读取前 8 个字节的数据,并逐一判断每个字节的内容是否一致。

3.2 定义 check 函数

为了实现逐字节比对并能够更好地实现复用,阿宝哥定义了一个 check 函数:

function check(headers) {   return (buffers, options = { offset: 0 }) =>     headers.every(       (header, index) => header === buffers[options.offset + index]     ); }

3.3 检测 PNG 图片类型

基于前面定义的 readBuffer 和 check 函数,我们就可以实现检测 PNG 图片的功能:

3.3.1 html 代码

<div>    选择文件:<input type="file" id="inputFile" accept="image/*"               onchange="handleChange(event)" />    <p id="realFileType"></p> </div>

3.3.2 JS 代码

const isPNG = check([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]); // PNG图片对应的魔数 const realFileElement = document.querySelector("#realFileType");  async function handleChange(event) {   const file = event.target.files[0];   const buffers = await readBuffer(file, 0, 8);   const uint8Array = new Uint8Array(buffers);   realFileElement.innerText = `${file.name}文件的类型是:${     isPNG(uint8Array) ? "image/png" : file.type   }`; }

以上示例成功运行后,对应的检测结果如下图所示:

JavaScript怎么检测文件的类型

由上图可知,我们已经可以成功地检测出正确的图片格式。如果你要检测 JPEG 文件格式的话,你只需要定义一个 isJPEG 函数:

const isJPEG = check([0xff, 0xd8, 0xff])

然而,如果你要检测其他类型的文件,比如 pdf 文件的话,应该如何处理呢?这里我们先使用 Synalyze It! Pro 编辑器来浏览一下 PDF  文件的二进制内容:

JavaScript怎么检测文件的类型

观察上图可知,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.png)为例,来看一下实际的情况:

JavaScript怎么检测文件的类型

好的,在前端如何检测文件类型就介绍到这里。在实际项目中,对于文件上传的场景,出于安全考虑,建议小伙伴们在开发过程中,都限制一下文件上传的类型。对于更严格的场景来说,就可以考虑使用阿宝哥介绍的方法来做文件类型的校验。此外,如果你对前端如何处理二进制数据感兴趣可以阅读  玩转前端二进制。

以上是“JavaScript怎么检测文件的类型”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: JavaScript怎么检测文件的类型

本文链接: https://www.lsjlt.com/news/280529.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript怎么检测文件的类型
    这篇文章主要介绍JavaScript怎么检测文件的类型,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式...
    99+
    2023-06-15
  • JavaScript 检测文件的类型的方法
    目录一、如何查看图片的二进制数据二、如何区分图片的类型三、如何检测图片的类型3.1 定义 readBuffer 函数3.2 定义 check 函数3.3 检测 PNG 图片类型我们会...
    99+
    2022-11-12
  • 如何使用JavaScript 检测文件的类型
    这篇文章将为大家详细讲解有关如何使用JavaScript 检测文件的类型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、如何查看图片的二进制数据要查看图片对应的二进制数据,我们可以借助一些...
    99+
    2023-06-15
  • JavaScript中怎么检测数据类型
    本篇内容介绍了“JavaScript中怎么检测数据类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!检测数据类型1:typeof其返回结果都...
    99+
    2023-07-06
  • JavaScript之类型检测的案例
    这篇文章主要介绍了JavaScript之类型检测的案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、typeoftypeof:操作符返回一个字符串,表示未经计算的操作数的...
    99+
    2023-06-07
  • SpringBoot后端上传文件类型检测方式
    目录本文通过文件流头部判断文件类型1、添加配置文件checkFileHeader.properties2、编写读取properties文件类3、编写拦截器4、配置拦截文件文件上传大部...
    99+
    2022-11-13
  • JavaScript类型检测的方法实例教程
    前言 JavaScript是web前端广泛应用的语言之一,在网页应用制作、脚本制作、小程序等诸多领域具有不可替代的的地位。笔者学习了一端时间的前端,颇感JS知识点的繁碎,故将学习到...
    99+
    2022-11-12
  • JavaScript中检测数据类型的四种方法
    目录1. typeof2. instanceof3. constructor(构造函数)4. Object.prototype.toString.call()前言:在介绍检测数据类型...
    99+
    2022-11-12
  • JavaScript中检测数据类型的四种方法总结
    目录检测数据类型1:typeof检测数据类型2:instanceof检测数据类型3:constructor检测数据类型4:Object.prototype.toString.call...
    99+
    2023-05-16
    JavaScript检测数据类型方法 JavaScript检测数据类型 JavaScript数据类型
  • 怎么使用PHP函数来检测变量的类型
    本篇内容介绍了“怎么使用PHP函数来检测变量的类型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!PHP中提供了许多检测数据类型的函数,但大致...
    99+
    2023-06-20
  • JavaScript中检测数据类型的四种方法分别是什么
    这期内容当中小编将会给大家带来有关JavaScript中检测数据类型的四种方法分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前言:在介绍检测数据类型的方法之前,先说说JavaScript中数据类...
    99+
    2023-06-26
  • Python简单检测文本类型的2种方法【基于文件头及cchardet库】
    本文实例讲述了Python简单检测文本类型的方法。分享给大家供大家参考,具体如下: 1、根据文件头。 #是否为带BOM头的UTF8文件 def IsUtf8BomFile(pathfile): if...
    99+
    2022-06-04
    种方法 文本 类型
  • php文件检测为木马怎么处理
    如果您的PHP文件被检测为木马,以下是一些处理方法:1. 暂时禁用文件:将被检测为木马的PHP文件从服务器上移除或者改名,以防止其继...
    99+
    2023-09-07
    php
  • JavaScript事件类型怎么使用
    本篇内容介绍了“JavaScript事件类型怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Jav...
    99+
    2022-10-19
  • 基于md5的文件完整性检测是怎么样的
    这期内容当中小编将会给大家带来有关基于md5的文件完整性检测是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。md5sum是Linux平台下面用来检测文件完整性的给力工具,维基百科是这样来解释&nb...
    99+
    2023-06-06
  • python怎么判断文件类型
    在python中使用filetype库判断文件类型:1.新建python项目;2.导入filetype库;3.使用filetype.guess()方法存储文件路径;4.通过if语句判断文件类型;具体步骤如下:首先,打开python,并新建一...
    99+
    2022-10-21
  • python怎么修改文件类型
    使用python修改文件类型的方法:1.新建python项目;2.导入os模块;3.定义文件路径;4.使用os.split()方法获取文件名;5.使用os.splitext()方法获取文件类型;6.使用os.rename()修改文件类型;具...
    99+
    2022-10-23
  • java中怎么检查变量的类型
    在Java中,可以使用instanceof关键字来检查变量的类型。语法如下:javavariable instanceof Type...
    99+
    2023-10-18
    java
  • Webpack热部署检测不到文件变化怎么办
    小编给大家分享一下Webpack热部署检测不到文件变化怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!调研了一下,原来 We...
    99+
    2022-10-19
  • shell脚本怎么实现实时检测文件变更
    这篇文章主要讲解了“shell脚本怎么实现实时检测文件变更”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell脚本怎么实现实时检测文件变更”吧!使用python做web开发,现在流行使用...
    99+
    2023-06-09
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作