首页 > 其他分享 >JS 根据文件Magic Number判断文件是否是图片

JS 根据文件Magic Number判断文件是否是图片

时间:2023-12-31 20:33:06浏览次数:30  
标签:function 文件 return bytes Number var Magic false data

原理:检测文件的 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);

原文链接

JS 根据文件Magic Number判断文件是否是图片

标签:function,文件,return,bytes,Number,var,Magic,false,data
From: https://www.cnblogs.com/LiangSenCheng/p/17937954

相关文章

  • Spring学习记录之引入外部属性配置文件
    Spring学习记录之引入外部属性配置文件前言这篇文章是我第二次学习b站老杜的spring相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解......
  • matlab读写pgm文件
    读文件1@4l#|,g3m/X$g$p+t%functiondisp_pgm(pgm_image_name)%不支持文件中有注释pgm_image_name='tmp.pgm';f=fopen(pgm_image_name,'r');iff==-1error(['Couldnotopenfile',pgm_image_name]);end/t2V;a(c$l1A$C'j......
  • 使用windbg分析dump文件
    使用windbg分析dump文件的步骤。准备工作。打开dump文件。指定符号表文件的路径。指定可执行文件的路径。指定源码文件的路径。在windbg的命令行,输入并执行如下命令.reload,重新加载前述数据文件。!analyze-v,分析dump文件。kbn,得到崩溃时的调用栈信息。.ecxr,打开栈......
  • Apache POI 操作Excel文件--写入数据至客户端
    publicvoidexprotBusinessData(HttpServletResponsehttpServletResponse){//1.查询数据库LocalDateTimebegin=LocalDateTime.of(LocalDate.now().minusDays(30),LocalTime.MIN);LocalDateTimeend=LocalDateTime.of(LocalDate.now().minus......
  • Microsoft 365 开发:如何通过PnP Powershell批量删除文件夹或文件等
    51CTOBlog地址:https://blog.51cto.com/u_13969817通常删除文件夹可以在UI界面操作比较方面,但是如果想快速的删除文件夹以及其childfolder,该如何操作呢?解决方案:本文将介绍如何使用PnPPowerShell脚本删除SharePoint文档库中的文件夹:第一步是通过运行cmdlet:ConnectPnPOnline来......
  • Microsoft 365 新功能速递:如何用Powershell为SPO文件夹设置不同颜色
    51CTOBlog地址:https://blog.51cto.com/u_13969817微软最近推出了一项新功能,允许用户在SharePointOnline和OneDrive中使用预设的16种颜色为文件夹上色。此功能适用于新文件夹和现有文件夹。现在,用户可以使用不同的颜色自定义文件夹,以便更好地管理文件,比如:·      提供工作......
  • 前端数据流组装指定格式的文件下载
    有的时候,我们从后端获取了文件数据,需要在前端组合成指定格式的文件,并下载。组合文件,除了数据,还需要规定格式,才知道组合成什么格式的文件。主要代码如下:/**responseText后端获取的文件数据*这里以pdf格式的文件举例,设置type为pdf文件需要的类型**/constblobFil......
  • Java递归查询文件下所有的图片,移动到指定文件夹中,分批次建立子文件夹
    1.代码实例将/Users/shiheng/desktop/测试文件目录下的图片(包含子文件夹目录下的图片)移动到了/Users/shiheng/desktop/测试结果目录下,默认不分批次建立子文件夹,重名文件只保存一个,代码如下所示:packagecom.syrdbt.java.study;importjava.io.File;importjava.util.*;/**......
  • [VMware] ESXI如何原地升级(保留文件)
    ESXI6.7老生常谈,在虚拟化技术中,ESXi6.7是VMware的一款重要的产品。它是一款裸机hypervisor,可以安装在物理服务器上,将物理服务器转化为多个虚拟机,从而提升硬件的利用率。ESXi6.7版本相比于之前的版本,有许多新功能和改进,这些新功能不仅提升了性能,也增强了安全性和管理性。目前来说......
  • 拷贝文件到ubuntu服务器
    连接硬盘到Ubuntu服务器,用sudofdisk-l查看连接情况,如果没有显示出设备,那么换一个端口(USB口)试试挂载硬盘sudomkdirusbsudomount/dev/sdc2/home/usb查看当前所处目录的整个大小du-sh查看磁盘空间使用情况sudodf-h拷贝目录(包括子目录)文件到指定文件夹下  cd......