图片验证

根据图片头信息验证


    const files = document.getElementById('files')
    const arr = [];
    files.onchange = async function(e) {
      const file = e.target.files;
      arr.push(file[0].slice(0, 6))
      const type = await blobToString(file[0].slice(0, 10))
      console.log(await isJpg(file[0]))
    }

    async function isGif(file) {
      // GIF89a 和 GIF87a
      // 前面6个16进制,'47 49 46 38 39 61' '47 49 46 38 37 61'
      const ret = await blobToString(file.slice(0, 6))
      return (ret === '47 49 46 38 39 61' || ret === '47 49 46 38 37 61')
    }

    async function isPng(file) {
      const ret = await blobToString(file.slice(0, 8))
      return ret === '89 50 4E 47 0D 0A 1A 0A'
    }

    async function isJpg(file) {
      const leng = file.size;
      const start = await blobToString(file.slice(0, 2))
      const end = await blobToString(file.slice(-2, leng))
      return (start === 'FF D8' && end === 'FF D9');
    }

    async function isImage(file) {
      // 通过文件流来判断,
      return await isGif(file) || await isPng(file)
    }

    function blobToString(blod) {
      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()) // 转换为 16进制 在将字符串转换为大写
            .map( v=> v.padStart(2, '0')) // 头部补全
            .join(' ');
          resolve(ret)
        }
        // 开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。
        reader.readAsBinaryString(blod)
      })
    }
posted @ 2020-11-18 15:24  渡心°  阅读(376)  评论(0编辑  收藏  举报