JavaScript与魔数检测

写了一部分简单代码:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script defer src="main.js"></script>
</head>
<body>
  <input type="file" name="" id="input_file">
  <button id="verify">识别</button>
  <span id="type"></span>
</body>
</html>

main.js

// 魔数来源:https://www.garykessler.net/library/file_sigs.html
// 有一个开源库做了同样的事情:https://github.com/sindresorhus/file-type
// ![](https://miro.medium.com/max/700/1*TOsMg_Nt65o16AOuGRdi4A.png)

const magicjson = {
  "D0CF11E0A1B11AE1": "application/wps-office.ppt",
  "89504E470D0A1A0A": "image/png",
  "6674797071742020": "video/quicktime",
  "504B030414000600": "application/wps-office.xlsx",
  "504B03040A000000": "application/wps-office.docx",
  "3C68746D6C3E0A0A": "text/html",
  "3C21646F63747970": "text/html",
  "526172211A0700":   "application/vnd.rar",
  "7F454C46":         "application/x-sharedlib", 
  "504B0304":         "application/zip",
  "464C5601":         "video/x-flv",
  "3C737667":         "image/svg+xml",
  "25504446":         "application/pdf",
  "1A45DFA3":         "video/webm",
  "FFD8":             "image/jpeg", // (.jpg, .jpeg, .jfif, .pjpeg, .pjp)
  "4D5A":             "application/x-ms-dos-executable",
  // 2066747970
  // "4D5A900003000000": "application/x-ms-dos-executable",
  // "504B0304": "application/vnd.android.package-archive",
  
  // application/x-executable
  // application/graphql
  // application/javascript
  // application/json
  // application/ld+json
  // application/feed+json
  // application/msword (.doc)
  // application/sql
  // application/vnd.api+json
  // application/vnd.ms-excel (.xls)
  // application/vnd.ms-powerpoint (.ppt)
  // application/vnd.oasis.opendocument.text (.odt)
  // application/vnd.openxmlformats-officedocument.presentationml.presentation (.pptx)
  // application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (.xlsx)
  // application/vnd.openxmlformats-officedocument.wordprocessingml.document (.docx)
  // application/x-www-form-urlencoded
  // application/xml
  // application/zstd (.zst)
  // application/macbinary (.bin)
  // audio/mpeg
  // audio/ogg
  // image/apng
  // image/avif
  // image/flif
  // image/gif
  // image/jxl
  // image/x-mng
  // multipart/form-data
  // text/css
  // text/csv
  // text/php
  // text/plain
  // text/xml
}

async function verify() {
  const file = document.getElementById("input_file").files[0];
  console.log(file);

  const magicnumber = await getMagicNumber(file);
  console.log(magicnumber);

  const numbers = Object.keys(magicjson)
  
  for (let i = 0; i < numbers.length; i++) {
    if (magicnumber.indexOf(numbers[i]) == 0) {
      document.getElementById("type").innerHTML = magicjson[numbers[i]];
      return magicjson[numbers[i]];
    }
  }
  
  console.error("没找到!");
}

async function getMagicNumber(fileblob) {
  const arraybuffer = await fileblob.arrayBuffer();
  const dataview = new DataView(arraybuffer);
  return dataview.getBigUint64().toString(16).toUpperCase();
}

document.getElementById("verify").onclick = verify;
posted @ 2021-10-19 10:05  汪淼焱  阅读(283)  评论(0编辑  收藏  举报