在日常工作中,文件上传是一个很常见的功能。在某些情况下,我们希望能限制文件上传的类型,比如限制只能上传 PNG 格式的图片。针对这个问题,我们会想到通过 input 元素的 accept 属性来限制上传的文件类型。这种方案虽然可以满足大多数场景,但如果用户把 JPEG 格式的图片后缀名更改为 .png 的话,就可以成功突破这个限制。那么应该如何解决这个问题呢?其实我们可以通过读取文件的二进制数据来识别正确的文件类型。
计算机并不是通过图片的后缀名来区分不同的图片类型,而是通过 “魔数”(Magic Number)来区分。 对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型。
常见图片类型对应的魔数如下表所示:
文件后缀名及文件的 mime 类型均改变了。很明显通过 文件后缀名或文件的 MIME 类型 并不能识别出正确的文件类型。
1、定义 readBuffer 函数
在获取文件对象后,我们可以通过 FileReader API 来读取文件的内容。因为我们并不需要读取文件的完整信息,所以可以封装一个 readBuffer 函数,用于读取文件中指定范围的二进制数据。
对于 PNG 类型的图片来说,该文件的前 8 个字节是 0x89 50 4E 47 0D 0A 1A 0A。因此,我们在检测已选择的文件是否为 PNG 类型的图片时,只需要读取前 8 个字节的数据,并逐一判断每个字节的内容是否一致。
2、定义 check 函数
为了实现逐字节比对并能够更好地实现复用,再定义了一个 check函数:
3、检测 PNG 图片类型
基于前面定义的 readBuffer 和 check 函数,我们就可以实现检测 PNG 图片的功能:
以上示例成功运行后,对应的检测结果如下图所示
由上图可知,我们已经可以成功地检测出正确的图片格式。如果你要检测 JPEG 文件格式的话,你只需要定义一个 isJPEG 函数
在实际工作中,遇到的文件类型是多种多样的,针对这种情形,你可以使用现成的第三库来实现文件检测的功能,比如 file-type 这个库。
1、文件检测存在的问题
通常,我们的程序通过文件后缀名检测类型,这是最直接简洁的方式。但是在一些情况下,直接通过后缀名检测文件类型,不太合适或行不通,比如:
(1)只得到了数据流,但是没有文件名
(2)被重命名后缀名,或者去掉后缀储存的文件
(3)文件后缀和实际内容不匹配或后缀名不受信任
2、file-type 原理
file-type 可以直接检测一个Buffer数据流,得到这个Buffer数据的内容(文件)类型。
file-type 的原理是检测文件/数据的Magic Number。通常情况下,一些知名的文件类型,在其文件开头的几个字节用来标志其文件类型,这几个字节就叫做 Magic Number。比如,PDF文件开头的几个字节是 %PDF(hex: 25 50 44 46)。
file-type 现在已经支持的文件类型列表:
3、问题介绍及处理
最近做一个需求,只是单纯的图片上传,结果测试出现图片上传成功,但是放到产品里面黑了,而且只是两张图片会这样,后来是测试说不行的那两张图片是直接修改过后缀名的。上网查了查,原来每个文件的文件字节流开头内容都会有一个文件类型的标记,其实文件字节流就是这个文件,改了后缀名,这个文件字节流的文件类型标记是不会被修改的。
测试是可以检测,因为没有深入了解字节流的含义,里面检测其他类型有很多不同的判断,png其实还有其他判断,这边给省略了:
里面代码还有截取字节流,还有判断两张参数的,还有判断第几个开始的,看起来很复杂。
相对来说,用input的accept进行拦截应该是满足需求了,知道了这个,如果以后后台出现类型不符合或者需求需要,就不会没有一点概念了。
先简单介绍一下JS的基本数据类型: 基本类型:Undefined、Null、Boolean、Number和String。 引用类型:Object(Array-数组对象 Reg
死锁,编码中常见的问题,如何发现死锁
尽管强制要求员工定期更改密码是件好事,但必须对这项活动进行监督,内部人员不受监控的密码更改或重置可能会导致严重的安全漏洞,管理员需要密切关注密码更改和重置,以确保他们获得授权并确保其 Active Directory(AD)环境安全。
$("#form_InsureStatus:checked").length==1
# 如何在Java中选中配置文件在Java应用程序中,管理配置文件是一项重要的工作。特别是在多环境下(如开发、测试、生产环境),我们常常需要根据当前环境来选择相应的配置文件。本文将通过一个实际的例子,介绍如何在Java项目中灵活地选中配置文件,并展示如何实现动态切换配置文件的功能。## 背景假设我们有一个简单的Java应用程序,该应用程序需要根据不同的环境加载数据库配置。我们可以通过配
全选、全不选、反选功能("myForm");
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <titl
# JavaScript 检测选中的复选框在网页开发中,复选框(checkbox)是用户常用的输入元素。我们有时需要检测哪些复选框被选中,接下来我们将详细讲解如何实现这一功能。## 实现流程在实现“检测选中的复选框”之前,我们可以将整个流程简化为以下几个步骤:| 步骤 | 操作 | 描述 ||-
今天在写图片上传功能时,想要在前端检测用户选中的文件是否为图片的功能,首先当然是在 input 里面设置 accept="image/*" 啦,但是这样也不能保证上传的一定是图片,因为用户可以在选择文件框中修改展示的文件后缀,令其可以选中所有类型的文件。于是,便需要在 js 中进行判断。我先去谷歌了一下其他人的方法,通常大家有两种判断方法,其一是获取上传文件的 type 属性值,但是这并
/** * 选中多选框 * @param val split符号分隔的多值字符串,一般为后台取出传递给前台 * @param chkName checkbox组的name * @param split 分隔符 * 调用方式: 在页面加载完成后调用该方法,给定参数,自动根据val勾选chkName复选框 */function transVal2Checkbox(val,chkName
多光谱成像技术结合颜色特征分析为茶叶分类提供了高效、非破坏性的解决方案。本文系统综述了该技术的原理、方法、应用案例及挑战,探讨了其在茶叶品质分级、品种识别和产地溯源中的研究进展,并展望了未来发展方向。
网络存储卷 Kubernetes 拥有众多类型的用于适配专用存储系统的网络存储卷。这类存储卷包括传统的 NAS 或 SAN 设备(如 NFS、iSCSI、fc)、分布式存储(如 GlusterFS、RBD)、云端存储(如 gcePersistentDisk、azureDisk、cinder 和 awsElasticBlockStore)以及建构在各类存储系统之上的抽象管理层(如 flo
摘要:本文详细介绍了在CentOS7系统中使用root账户登录及初始设置的完整流程,包括登录方式选择、密码输入、语言键盘设置等步骤,并给出安全使用建议。文章强调root账户的高危性,建议日常使用普通用户账户,同时预告了后续关于修改主机名的教程内容。该教程是《大数据环境搭建从零开始》系列的第五篇,适合刚完成系统安装的用户参考。
Ansible本身没有原生Web界面,但有三种实现方案:1)官方商业产品Ansible Automation Platform,提供企业级Web管理和完整功能;2)开源替代品AWX,功能强大但需自行维护;3)轻量级第三方工具如Semaphore,适合小型团队。AWX是最受欢迎的开源选择,而商业版适合需要官方支持的企业。根据团队规模和技术能力选择合适方案即可实现Ansible的Web管理。