js判断文件类型详解

article/2025/10/19 13:34:31

js判断文件类型详解

通过file的type属性判断

<input type="file" onchange="onchangecb(this)" />
<script>
function onchangecb(e) {const file = e.files[0];console.log(file.type);
}
</script>

htmlinput标签,就是根据选择文件的后缀来生成一个File对象。

像下面的几种文件:

txt文件:
在这里插入图片描述

jpg文件:
在这里插入图片描述

mp4文件:

在这里插入图片描述

使用文件后缀来判断

function onchangecb(e) {const file = e.files[0];//获取最后一个.的位置const index= file.name.lastIndexOf(".");//获取后缀const ext = file.name.substr(index+1);console.log(ext);
}

在得到文件后缀名后,根据后缀即可判断文件的类型(文件格式)。比如需要判断一个文件是否是图片格式,首先定义一个判断函数:

function isImage(ext) {return ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'webp', 'psd', 'svg', 'tiff'].indexOf(ext.toLowerCase()) !== -1;
}

虽然可以直接通过对象的type属性或者文件后缀来获取文件类型,但是如果强行修改文件后缀,同样可以将其他类型的文件上传至服务器,或者文件压根就没有后缀,那又要怎么判断呢?因此前端需要使用一个更加合理的方式。

根据二进制流及文件头来判断

虽然文件后缀可以手动改,因此可以直接通过读取文件的二进制来判断。

通常来说固定类型的文件头都是相同的,比如说jpeg的文件头是FF D8 FF E0

这里提供一些常用的文件头:

const fileMap = {JPEG: "FF D8 FF E0",JPG: "FF D8 FF E1",PNG: "89 50 4E 47",GIF: "47 49 46 38",TIFF: "49 49 2A 00",BMP: "42 4D",DWG: "41 43 31 30",PSD: "38 42 50 53",RTF: "7B 5C 72 74 66",XML: "3C 3F 78 6D 6C",HTML: "68 74 6D 6C 3E",EML: "44 65 6C 69 76 65 72 79 2D 64 61 74 65 3A",DBX: "CF AD 12 FE C5 FD 74 6F",PST: "21 42 44 4E",XLS: "D0 CF 11 E0",DOC: "D0 CF 11 E0",MDB: "53 74 61 6E 64 61 72 64 20 4A",WPD: "FF 57 50 43",PDF: "25 50 44 46 2D 31 2E",QDF: "AC 9E BD 8F",PWL: "E3 82 85 96",ZIP: "50 4B 03 04",RAR: "52 61 72 21",WAV: "57 41 56 45",AVI: "41 56 49 20",RAM: "2E 72 61 FD",RM: "2E 52 4D 46",MPG: "00 00 01 BA",MPG: "00 00 01 B3",MOV: "6D 6F 6F 76",ASF: "30 26 B2 75 8E 66 CF 11",MID: "4D 54 68 64",MP3: "49 44 33",
};

通过onchange方法获取到选择的文件后,使用FileReader读取文件的二进制,之后判断二进制的前几位是否跟符合相应类型文件的文件头。

以下是一些使用文件头来判断文件类型的简单代码

// 判断文件后缀与该文件内容是否相同类型
async function isSameFileType(file) {const suffix = getFileSuffix(file.name).toUpperCase();const fileBlobString = await blobToString(file.slice(0, 14));// 如果文件类型中没有该类型,默认为falseif (!(suffix in fileMap)) {return false;}return fileBlobString.includes(fileMap[suffix]);
}async function blobToString(blob) {return new Promise((resolve) => {const reader = new FileReader();reader.onload = function () {const ret = reader.result.split("") // 分隔开.map((v) => v.charCodeAt()) // 循环返回指定位置的字符的 Unicode 编码.map((v) => v.toString(16).toUpperCase()) // 返回十六进制格式.map((v) => v.padStart(2, "0")) // 给空的那个填充 00 ,防止空缺.join(" "); // 每个子节之间空格隔开resolve(ret);};reader.readAsBinaryString(blob); // 调用之后触发onload事件});// 二进制=》ascii码=》转成16进制字符串
}// 获取文件后缀
function getFileSuffix(filename) {return filename.substring(filename.lastIndexOf(".") + 1, filename.length);
}

判断是否是png类型:

async function isPng(file) {// 同理const ret = await blobToString(file.slice(0, 4));const ispng = ret === fileMap.PNG;return ispng;
}

当然也可以针对图片高宽进行限制:
png二进制中,第18-20位是图片的宽,22-24是高。

获取图片宽高:

function getRectByOffset(file, widthOffset, heightOffset, reverse) {let width = await blobToString(file.slice(...widthOffset));let height = await blobToString(file.slice(...heightOffset));const w = parseInt(width.replace(" ", ""), 16);const h = parseInt(height.replace(" ", ""), 16);return { w, h };
}

修改一下之前判断isPng的方法,加上高宽限制

const IMG_WIDTH_LIMIT = 1000;
const IMG_HEIGHT_LIMIT = 800
function isPng(file) {// 同理const ret = await this.blobToString(file.slice(0, 4));const ispng = ret === fileMap.PNG;if (ispng) {const { w, h } = await this.getRectByOffset(file, [18, 20], [22, 24]);console.log(`png 宽高 ${w},${h}`);if (w > IMG_WIDTH_LIMIT || h > IMG_HEIGHT_LIMIT) {this.$message.error("png图片宽高不得超过 " + IMG_WIDTH_LIMIT + "和" + IMG_HEIGHT_LIMIT);return false;}}return ispng;
}

http://chatgpt.dhexx.cn/article/UeOGBJH4.shtml

相关文章

JS——判断变量类型方法汇总

判断变量类型 一、使用typeof判断变量类型二、使用instanceof判断变量的类型三、使用constructor判断变量的类型四、使用Object.prototype.toString.call判断变量的类型五、使用jquery中$.type判断变量的类型。六、总结 在JS中&#xff0c;有 5 种基本数据类型和 1 种复杂数据类…

JavaScript中的类型判断

js中的类型判断 1、使用typeof进行类型判断2、使用 instanceof 判断对象3、使用Array.isArray()判断数组 1、使用typeof进行类型判断 function fun() { }; console.log("数字的类型为&#xff1a;" typeof (1)); console.log("字符串的类型为&#xff1a;&quo…

js:判断数据类型的几种方法

参考文章&#xff1a;JavaScript中判断对象类型的几种方法总结 根据要判断的数据对象&#xff0c;来选用合适的方法 1、原始数据类型 6种&#xff1a;number、string、boolean、undefined、null、symbol 一、typeof let str hello; console.log(typeof str); // string【特…

JS判断数据类型的几种方式

JS中常见的几种数据类型 基本类型&#xff1a;string、boolean、number特殊类型&#xff1a;undefined和null3、引用类型&#xff1a;Array、Date、RegExp… typeof typeof检测基本数据类型时没有问题&#xff0c;但是当其对引用类型进行检测时&#xff0c;会返回object&…

js 精确判断对象的类型

在 JavaScript 里使用 typeof 来判断数据类型&#xff0c;只能区分基本类型&#xff0c;即 “number”&#xff0c;”string”&#xff0c;”undefined”&#xff0c;”boolean”&#xff0c;”object” 五种。 对于数组、函数、对象来说&#xff0c;其关系错综复杂&#xff0c…

JavaScript——判断js数据类型(类型检测)

判断js数据类型&#xff0c;也就是我们说的类型检测&#xff0c;本文提供五种方法&#xff0c;分别是typeof运算符、instanceof操作符、Object.prototype.toString方法、constructor属性、duck type。 1、typeof运算符 typeof算是最常见的了&#xff0c;使用它会返回一个字符…

js判断数据类型常用的6种方法

js判断数据类型常用的方法,不论在开发中开始在面试中,都是经常遇到的问题,尤其是在面试时,当面试官问及js判断数据类型的方法时,回答的越多,说明掌握的广度跟深度越多,感觉自己逼格也越高.废话不多说了,进入正题 常见的判断js数据类型的方法有如下几种 1.最常见的判断方法&am…

js判断数据类型的几种方法

第一种&#xff1a;Object.prototype.toString()方法&#xff1a; 注意这里是Object原型对象上的toString方法才能判断&#xff0c;其他原型对象上的不能判断&#xff0c;如 Array原型对象上的toString方法是判断不了的&#xff0c;因为它重写了toString方法。 要使用Object…

js判断数据类型(全)

js基本数据类型 基本数据类型&#xff1a; String、Number、Boolean、Undefined未定义、null空、symbol表示独一无二的值&#xff08;es6引入的新的原始数据基本类型&#xff09;。 Number&#xff1a;返回的特殊值NaN&#xff0c;表示不是数值&#xff0c;用于表示本来要返回…

判断JS数据类型的五种方法

JavaScript 中常见的几种数据类型&#xff1a; 目录 JavaScript 中常见的几种数据类型&#xff1a; 一、分类 二、判断 1、typeof null既然属于基本数据类型&#xff0c;为什么用typeof返回的是object呢&#xff1f; js小数运算出现的问题(精度丢失) 解决方法一 解决方…

Linux 文件类型及常用命令(2)(cp、mv、cat、more、less、head、tail、chmod、getenforce)

1、命令 cp&#xff1a;拷贝&#xff08;类似于Windows系统的复制&#xff0c;但区别是可以重命名&#xff09; 拷贝文件、目录&#xff08;需要使用 -r 参数&#xff09;&#xff0c;可以重命名。 2、命令 mv&#xff1a;移动或重命名 ①如果是在当前目录下移动&#xff0c…

Linux验证SELinux状态

安全增强型Linux&#xff08;SELinux&#xff09;是一个Linux内核的功能&#xff0c;它提供支持访问控制的安全政策保护机制。记录操作如何验证SELinux&#xff0c;并且避免系统无法启动的问题。 以root权限执行&#xff1a;sudo su - 运行命令getenforce&#xff0c;验证SELi…

Linux 查看 SELinux 的状态

可以运行下面的命令来查看当前服务配置的 SELinux 的状态。 getenforce 上面的输出状态显示了当前 SELinux 的配置状态。 如果上图显示当前的状态。 临时禁用 SELinux 。 使用下面的命令来临时禁用 SELinux。 setenforce 0 Linux 查看 SELinux 的状态 - 系统和容器 - OSSE…

Android Senlinux 基础说明

一、SELinux 三种模式简介 Enforcing&#xff1a;强制模式。代表SELinux在运行中&#xff0c;且已经开始限制domain/type之间的验证关系Permissive&#xff1a;宽容模式。代表SELinux在运行中&#xff0c;不过不会限制domain/type之间的验证关系&#xff0c;即使验证不正确&…

如何关闭防火墙和selinux操作

在每次部署相关软件的时候总是会遇到各种奇奇怪怪的问题&#xff0c;多半是防火墙没有关&#xff0c;或者是selinux没有关 如何关闭防火墙&#xff1a; 那先来看一下防火墙的状态&#xff1a;systemctl status firewalld 如果是下图所示开着的&#xff0c;那就把它给关了&am…

Linux下如何关闭SELinux的图文教程(完整版)

大家好&#xff01; 最近遇到Mysql数据启动报错的问题&#xff0c;于是发现是因为SELinux没有关闭&#xff0c;那么这篇文章就简单的记录SElinux是如何让关闭的。 前言 SELinux(Security-Enhanced Linux) 是美国国家安全局&#xff08;NSA&#xff09;对于强制访问控制的实现…

Android8.x/9.x/10.x user版本关闭selinux以及打开UART控制台输入和关闭内核日志输出功能

1、user版本关闭selinux 仅限于系统调试时使用&#xff0c;量产版本需要将其设置回去成ELINUX_ENFORCING模式。 1.1)背景 C:\Users\zhaojr> adb root C:\Users\zhaojr> adb remount C:\Users\zhaojr> adb shell ac8257:/ # getenforce getenforce Enforcing这个表明…

GeForce Experience 绕过登录与禁止自动更新

本文说明了&#xff0c;如何在未注册Nvidia账户的情况下&#xff0c;绕过GeForce Experience&#xff08;以下简称为GFE&#xff09;账户登录的方法&#xff0c;从而直接使用登陆后才能使用的各种功能。在PC未联网的情况下&#xff0c;此方法依旧能正常绕过登录&#xff0c;直接…

adb shell getenforce/setenforce(三级命令)

adb shell getenforce adb shell setenforce

PyTorch官方教程(中文版)

PyTorch官方教程&#xff08;中文版&#xff09; TENSOR概述初始化向量对Tensor的操作转移存储位置到GPU张量的切片操作张量的合并操作张量乘法将单元素tensor转换为基本数据类型 与NumPy的联系tensor转numpynumpy转tensor DATASETS & DATALOADERS载入数据集迭代和可视化数…