当前位置:   article > 正文

前端分片上传及生成MD5

前端分片上传及生成MD5
const CHUNK_MD5_SIZE = 50 * 1024 * 1024; // MD5 分片大小
  1. // 使用 spark-md5
  2. import SparkMD5 from "spark-md5";
  3. function getFilesSparkMd5(file) {
  4. return new Promise((resolve, reject) => {
  5. let currentPosition = 0; // 当前读取位置
  6. const fileReader = new FileReader();
  7. const spark = new SparkMD5.ArrayBuffer();
  8. // 逐块读取文件内容并计算MD5
  9. const processChunk = (chunk) => {
  10. return new Promise((resolve, reject) => {
  11. spark.append(chunk);
  12. currentPosition += chunk.byteLength;
  13. resolve();
  14. });
  15. };
  16. // 读取下一个块
  17. const loadNextChunk = () => {
  18. const fileSlice = file.slice(
  19. currentPosition,
  20. currentPosition + CHUNK_MD5_SIZE
  21. );
  22. fileReader.readAsArrayBuffer(fileSlice);
  23. };
  24. // file Reader onload
  25. fileReader.onload = (e) => {
  26. const chunk = e.target.result;
  27. if (chunk) {
  28. processChunk(chunk).then(() => {
  29. if (currentPosition < file.size) {
  30. loadNextChunk();
  31. } else {
  32. resolve(spark.end());
  33. }
  34. });
  35. }
  36. spark.append(e.target.result);
  37. let md5 = spark.end();
  38. resolve(md5);
  39. };
  40. // file Reader onerror
  41. fileReader.onerror = (err) => {
  42. reject(err.target.error);
  43. };
  44. // 开始读取第一个块
  45. loadNextChunk();
  46. });
  47. }
  48. // 同步调用
  49. async function uploadFile(file){
  50. await md5 = getFilesSparkMd5(file)
  51. }

  1. //使用 CryptoJS
  2. import CryptoJS from "crypto-js";
  3. function getFilesCryptoJSMD5(file) {
  4. return new Promise((resolve, reject) => {
  5. let currentPosition = 0; // 当前读取位置
  6. const fileReader = new FileReader();
  7. const md5 = CryptoJS.algo.MD5.create();
  8. // 逐块读取文件内容并计算MD5
  9. const processChunk = (chunk) => {
  10. return new Promise((resolve, reject) => {
  11. const wordArray = CryptoJS.lib.WordArray.create(chunk);
  12. md5.update(wordArray);
  13. currentPosition += chunk.byteLength;
  14. resolve();
  15. });
  16. };
  17. // 读取下一个块
  18. const loadNextChunk = () => {
  19. const fileSlice = file.slice(
  20. currentPosition,
  21. currentPosition + CHUNK_MD5_SIZE
  22. );
  23. fileReader.readAsArrayBuffer(fileSlice);
  24. };
  25. // fileReader onload
  26. fileReader.onload = (e) => {
  27. const chunk = e.target.result;
  28. if (chunk) {
  29. processChunk(chunk).then(() => {
  30. if (currentPosition < file.size) {
  31. loadNextChunk();
  32. } else {
  33. const md5Hash = md5.finalize().toString();
  34. resolve(md5Hash);
  35. }
  36. });
  37. }
  38. };
  39. // fileReader onerror
  40. fileReader.onerror = (err) => {
  41. reject(err.target.error);
  42. };
  43. // 开始读取第一个块
  44. loadNextChunk();
  45. });
  46. }
  47. // 同步调用
  48. async function uploadFile(file){
  49. await md5 = getFilesCryptoJSMD5(file)
  50. }

二者区别
 

SparkMD5crypto-js都是用于生成MD5哈希的JavaScript库,但它们之间存在一些区别:

  1. 库大小:

     

    SparkMD5是一个专门用于生成MD5哈希的轻量级库,它的文件大小相对较小(约为10KB)。而crypto-js是一个更加全面的加密库,它包含了许多其他加密算法(如SHA-1、SHA-256、SHA-512等),因此文件大小相对较大(约为200KB)。

  2. 浏览器支持:

     

    SparkMD5专为浏览器环境设计,它可以在浏览器中直接使用,而无需额外的配置。而crypto-js在浏览器环境中也可以使用,但需要使用<script>标签引入库文件,而不是通过import语句导入。

  3. API设计:

     

    SparkMD5的API设计简单易用,可以直接调用SparkMD5.hash()方法生成MD5哈希。而crypto-js的API设计更加复杂,需要使用CryptoJS.MD5()方法生成MD5哈希,并调用toString()方法将哈希值转换为字符串。

  4. 兼容性:

     

    SparkMD5crypto-js都支持现代浏览器和Node.js环境。但是,crypto-js在某些较旧的浏览器中可能存在兼容性问题。

  5. 我的开发项目中 文件需要再Linux 系统中解压 SparkMD5 生成的MD5 和Linux系统生成的MD5不一致,crypto-js 和 java Linux对于同一个文件生成了相同的MD5

总之,SparkMD5crypto-js都是用于生成MD5哈希的JavaScript库,但它们在库大小、浏览器支持、API设计和兼容性方面存在一些区别。在选择使用哪个库时,您需要根据项目需求和技术栈来权衡这些因素。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/205162
推荐阅读
相关标签
  

闽ICP备14008679号