前端上传文件防重,你还在比较文件名是否相同吗?

前端防重的两种方式。

  1. 比较文件名及大小是否相同。

  2. 通过文件内容(哈希值)检查,通过计算文件的哈希值来检测重复文件。

如何计算文件的哈希值?

 async function hashFile(file) {
 	// 获取文件的二进制数据 
    const arrayBuffer = await file.arrayBuffer();
    // 计算SHA-256哈希值
    const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
    // 将哈希值转换为字节数组
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    // 将字节数组转换为十六进制字符串
    const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
    return hashHex;
 }

Demo

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>File Upload Prevent Duplicate</title>
</head>
<body>
  <input type="file" id="fileInput" multiple>
  <button onclick="uploadFiles()">Upload</button>
  <ul id="fileList"></ul>

  <script>
    const uploadedFiles = new Set();

    async function hashFile(file) {
      const arrayBuffer = await file.arrayBuffer();
      const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
      const hashArray = Array.from(new Uint8Array(hashBuffer));
      const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
      return hashHex;
    }

    async function uploadFiles() {
      const fileInput = document.getElementById('fileInput');
      const fileList = document.getElementById('fileList');
      const files = Array.from(fileInput.files);

      for (const file of files) {
        const fileHash = await hashFile(file);

        if (!uploadedFiles.has(fileHash)) {
          uploadedFiles.add(fileHash);

          const listItem = document.createElement('li');
          listItem.textContent = `${file.name} (${file.size} bytes)`;
          fileList.appendChild(listItem);
        } else {
          alert(`File "${file.name}" is already uploaded.`);
        }
      }

      // 清空文件输入框
      fileInput.value = '';
    }
  </script>
</body>
</html>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值