js 上传文件_js精准判断上传文件类型

前言

一般来说,对于上传的文件,都要做类型过滤,指定哪些类型能上传,哪些不能上传。

最容易想到的,也是相对常用的,是直接使用文件的拓展名。

但拓展名可以手动修改,做不到精准,比如把一个word文档由.doc改为.png

解决方案

将上传文件转为二进制形式后,再获取其前四位头文件的十六进制编码,根据这个就可以精准判定上传文件类型。对于不符合上传格式要求的,直接在客户端做处理。

html代码

这里只做演示,写的比较简单,可根据实际业务场景添加字段

<form id="form">
 <p><input type="file" name="file" multiple id='file'>p>
 <p><input type="button" value="上传" id="btn">p>
form>

js代码

获取dom

let form = document.getElementById('form'); 
let btn = document.getElementById('btn'); 
let f = document.getElementById('file'); 

获取文件mime类型

更多文件类型可参考 https://blog.csdn.net/weixin_33826268/article/details/94604439

function getFileMimeType(file) {
  const map = {
      'FFD8FFE0': 'jpg',
      '89504E47': 'png',
      '47494638': 'gif',
      "52494646": 'webp'
  }

  const reader = new FileReader();
  reader.readAsArrayBuffer(file);
  return new Promise((resolve, reject) => {
      reader.onload = (event) => {
        try {
            let array = new Uint8Array(event.target.result);
            array = array.slice(0, 4);
            let arr = [...array]
            let key = arr.map(item => item.toString(16)
                .toUpperCase()
                .padStart(2, '0'))
                .join('')
            resolve(map[key])

        } catch (e) {
            reject(e);
        }
      };
  });
}

上传逻辑

btn.onclick = function () {
    if (f.files.length > 1) {
        for (const file of f.files) {
            upload(file)
        }
    } else {
        upload(f.files[0])
    }
}

function upload(file) {
  getFileMimeType(file).then(res => {
    if (res) {
        let fd = new FormData(form);
        let xhr = new XMLHttpRequest();
        xhr.open("post", '/api/uploadFiles');
        xhr.send(fd);
    } else {
        alert('文件格式不符合上传要求')
        f.value = ''
        return
    }

  }).catch(err => {
      console.log(err)
  })
}

总结

文件上传很常见,但也许并未考虑过精准性。

少用的二进制和类型数组,再次证明,存在即合理。

希望本文对你有所帮助。


情如风雪无常,

却是一动既殇。

感谢你这么好看还来阅读我的文章,

我是冷月心,下期再见。

0eafe6b66e1485507aa15931c5b035d6.png

点下在看,你最好看


http://www.niftyadmin.cn/n/732619.html

相关文章

Python Cookbook 之一 数据结构和算法(一): 将序列分解为单独的变量

欢迎大家扫码关注我的微信公众号&#xff1a; 将序列分解为单独的变量-目录一、问题二、解决方案三、讨论一、问题 一个包含 N 个元素的元组或序列&#xff0c; 现在想将它分解为 N 个单独的变量。 二、解决方案 任何序列&#xff08;或可迭代对象&#xff09;都可以通过一…

Python Cookbook 之一 数据结构和算法(二): 从任意长度的可迭代对象中分解元素

欢迎大家扫码关注我的微信公众号&#xff1a; 从任意长度的可迭代对象中分解元素一、问题二、解决方案2.1 * 表达式在首位2.2 * 表达式在中间2.3 * 表达式在末位三、讨论一、问题 需要从某个可迭代对象中分解出 N 个元素&#xff0c; 但是这个可迭代对象的长度可能超过 N&…

Nginx 之一 服务器的安装部署(二): Nginx 服务的启停控制

欢迎大家扫码关注我的微信公众号&#xff1a; Nginx 服务器的安装部署&#xff08;二&#xff09;-目录一、Nginx 服务的信号控制1.1 获取 Nginx 服务主进程 PID1.2 Nginx 服务可接收的信号二、Nginx 服务的启动三、Nginx 服务的停止3.1 停止方式一&#xff1a;3.2 停止方式二…

Python Cookbook 之一 数据结构和算法(三): 保存最后 N 个元素

欢迎大家扫码关注我的微信公众号&#xff1a; 保存最后 N 个元素一、问题二、解决方案三、讨论一、问题 我们希望在迭代或是其他形式的处理过程中对最后几项记录做一个有限的历史记录统计。 二、解决方案 保存有限的历史记录可算是 collections.deque 的完美应用场景了。 …

kali 更新源_kali安装docker环境

最近因为要在kali上搭建一个文件上传测试平台&#xff0c;所以得安装一个docker环境。安装https协议、CA证书、dirmngrapt-get updateapt-get install -y apt-transport-https ca-certificatesapt-get install dirmngr2.添加GPG密钥并添加更新源curl -fsSL https://mirrors.tun…

Python Cookbook 之一 数据结构和算法(四): 找到最大或最小的 N 个元素

欢迎大家扫码关注我的微信公众号&#xff1a; 找到最大或最小的 N 个元素一、问题二、解决方案三、讨论一、问题 我们想在某个集合中找出最大或最小的 N 个元素。 二、解决方案 heapq 模块中有两个函数 —— nlargest() 和 nsmallest() —— 它们正是我们所需要的&#xff…

opencv和matlab图像处理的效率与效果_图像处理在工程中的应用

点击蓝字关注我们传感器图像处理在工程和科研中都具有广泛的应用&#xff0c;例如&#xff1a;图像处理是机器视觉的基础&#xff0c;能够提高人机交互的效率&#xff0c;扩宽机器人的使用范围&#xff1b;在科研方面&#xff0c;相关学者把图像处理与分子动力学相结合&#xf…

Python 之 Linux 系统中一句命令搭建下载服务器

欢迎大家扫码关注我的微信公众号&#xff1a; Linux 系统中一句命令搭建下载服务器一、概述二、Python 2.x 版本实现三、Python 3.x 版本实现四、访问的方法一、概述 在工作或生活中&#xff0c; 我们有时候需要传输文件。 实现这个功能的方式有很多&#xff0c; 我们可以使用…