Vue获取图片MD5的方法详解

 更新时间:2024年12月28日 11:45:22   作者:窗边的鬼  
计算图片的MD5可以将其作为图片的唯一标识,从而优化对图片的存储和检索效率,本文主要介绍了Vue获取图片MD5的常用方法,感兴趣的可以了解下

背景

计算图片的MD5可以将其作为图片的唯一标识,从而优化对图片的存储和检索效率,还可以对图片进行有效的去重。

名词解释

哈希函数

哈希函数是一种数学函数,也称散列函数。它接受任意长度的输入,并可以将其转换为固定长度的随机字母和数字组成的字符串。由此函数计算的值具有不可逆性,即不能通过逆向演算回原本的数值,可以有效用于加密。

MD5

MD5是一种广泛使用的哈希函数,MD5算法会将图片/文件的二进制数据作为输入,计算出一个128位的哈希值,可以用于校验文件的完整性和唯一性。

MD5工具--spark-md5

npm地址

安装:npm install --save spark-md5

如果使用typeScript需要继续安装对应的类型:npm install --save @types/spark-md5

使用import SparkMD5 from 'spark-md5';

获取本地上传图片的MD5

计算MD5,重要的是获取文件的二进制数据

如果你使用的是原生的<input type="file">,则需要在change事件中找到e.target.files[0]文件

如果使用的是UI组件库,则一般获取file.raw

<input type="file" @change="changeFile" />
const changeFile = (e) => {
  const file = e.target.files[0];
  const fileReader = new FileReader();
  const spark = new SparkMD5.ArrayBuffer();
  fileReader.readAsArrayBuffer(file);
  fileReader.onload = (f) => {
    spark.append(f.target.result);
    const md5 = spark.end();
    console.log('md5', md5);
  };
};

运行结果:

获取支持跨域的网络图片的MD5

fetch获取

首先使用fetch API获取图片,然后将其转换为blob对象。然后,我们使用FileReaderreadAsArrayBuffer方法将blob转换为ArrayBuffer

const getFileMd5 = () => {
  const fileReader = new FileReader();
  const spark = new SparkMD5.ArrayBuffer();
  // 图片url 图片来源必须支持跨域
  fetch('https://picsum.photos/536/354')
    .then((response) => response.blob())
    .then((blob) => {
      fileReader.readAsArrayBuffer(blob);
      fileReader.onload = (e) => {
        spark.append(e.target?.result as ArrayBuffer);
        const md5 = spark.end();
        console.log('md5', md5);
      };
    })
    .catch(console.error);
};

运行结果:

Image对象获取

此方法需要将Image复制到canvas上面进行canvas.toDataURL(),此处涉及到<img>标签的特性:

一般情况下,<img>进行图片加载是不会发送网络请求的,出于安全考虑,没有通过CORS授权获取的图像是不允许在canvas中使用的。
因此需要在<img>标签上加上crossOrigin属性

更多属性相关内容可查看该链接:developer.mozilla.org/zh-CN/docs/Web/HTML/Element/img

<img class="testImg" src="https://picsum.photos/536/354" crossOrigin="anonymous" />
const getFileMd5 = () => {
  // 找到图片对象
  const image = document.querySelectorAll('.testImg')[0] as HTMLImageElement;

  // 将canvas上的内容转换为一个数据URL,该URL代表了canvas 的像素数据
  const canvas = document.createElement('canvas');
  canvas.width = image.width;
  canvas.height = image.height;
  const ctx = canvas.getContext('2d');
  ctx?.drawImage(image, 0, 0, canvas.width, canvas.height);
  const dataURL = canvas.toDataURL();

  // 将dataUrl数据转换为blob
  const arr = dataURL.split(',');
  const mimeList = arr[0].match(/:(.*?);/);
  if (!mimeList || !mimeList.length) return;
  const mime = mimeList[1];
  const bstr = atob(arr[1]);
  let n = bstr.length;
  const u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  const blob = new Blob([u8arr], { type: mime });

  // 计算md5
  const fileReader = new FileReader();
  const spark = new SparkMD5.ArrayBuffer();
  fileReader.readAsArrayBuffer(blob);
  fileReader.onload = (e) => {
    spark.append(e.target?.result as ArrayBuffer);
    const md5 = spark.end();
    console.log('md5', md5);
  };
};
// 方法调用:要保证图片已经加载完  可以使用setTimeout或者nextTick
setTimeout(() => getFileMd5(), 0);

获取不支持跨域的网络图片的MD5

此情况建议由服务端进行图片md5的计算

服务端设置响应头

需要服务端设置响应头 Access-Control-Allow-Origin: *

通过node转发获取

待补充

到此这篇关于Vue获取图片MD5的方法详解的文章就介绍到这了,更多相关Vue获取图片MD5内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue echarts封装组件需求分析与实现

    Vue echarts封装组件需求分析与实现

    在平常的项目中,echarts图表我们也是使用的非常多的,通常我们从后端拿到数据,需要在图表上动态的进行呈现,接下来我们就模拟从后端获取数据然后进行呈现的方法,这篇文章主要介绍了Vue echarts封装组件需求分析与实现
    2022-10-10
  • vue如何实现点击空白区域关闭弹窗

    vue如何实现点击空白区域关闭弹窗

    这篇文章主要介绍了vue如何实现点击空白区域关闭弹窗问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • vue3使用别名报错问题的解决办法(vetur插件报错问题)

    vue3使用别名报错问题的解决办法(vetur插件报错问题)

    最近在写一个购物网站使用vue,使用中遇到了问题,下面这篇文章主要给大家介绍了关于vue3使用别名报错问题的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • Vue实现双token无感刷新的示例代码

    Vue实现双token无感刷新的示例代码

    这篇文章主要介绍了Vue实现双token无感刷新,双token机制,尤其是指在OAuth 2.0授权协议中广泛使用的access token(访问令牌)和refresh token(刷新令牌)组合,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-03-03
  • vue中各种deep的区别解析

    vue中各种deep的区别解析

    在Vue3中,推荐使用::deep作为深度选择器,它比Vue2中的::v-deep语法更简洁,::v-deep、::deep、:deep()、&gt;&gt;&gt;和/deep/都是用于穿透组件作用域的选择器,但Vue3更倾向于使用::deep或:deep(),感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • vue-element内table插入超链接a标签的使用

    vue-element内table插入超链接a标签的使用

    在Vue Element的table组件中插入超链接,可以使用<el-link>标签替代传统的<a>标签,实现更加整洁的UI设计,具体操作是替换原有的<span>标签,直接使用<el-link>进行超链接的插入,使得链接样式与Element UI保持一致
    2024-09-09
  • 浅谈关于vue中scss公用的解决方案

    浅谈关于vue中scss公用的解决方案

    这篇文章主要介绍了浅谈关于vue中scss公用的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • vue移动端下拉刷新和上滑加载

    vue移动端下拉刷新和上滑加载

    这篇文章主要为大家详细介绍了vue移动端下拉刷新和上滑加载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)

    Vue+jsPlumb实现连线效果(支持滑动连线和点击连线)

    jsPlumb 是一个比较强大的绘图组件,它提供了一种方法,主要用于连接网页上的元素。本文将利用jsPlumb实现连线效果,同时支持滑动连线和点击连线,感兴趣的可以了解一下
    2023-01-01
  • 详解vue中父子组件传递参数props的实现方式

    详解vue中父子组件传递参数props的实现方式

    这篇文章主要给大家介绍了在vue中,父子组件传递参数 props 实现方式,文章通过代码示例介绍的非常详细,对我们的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-07-07

最新评论