前端快速实现点击图片下载

目录

方法一:同源使用标签下载图片

方法二:跨域使用将canvas上的内容转换为Blob对象并下载


在前端开发中,有时候我们需要实现点击图片后直接下载的功能。本文将介绍两种方法来实现这一功能:

  • 同源使用<a>标签下载图片
  • 跨域使用将canvas上的内容转换为Blob对象并下载。

方法一:同源使用<a>标签下载图片

同源情况下,我们可以通过创建一个<a>标签,设置其href属性为图片的链接,然后设置download属性为图片的文件名,就可以实现点击图片下载的功能。

<a href="image.jpg" download="image.jpg">
    <img src="image.jpg" alt="Image">
</a>

但当出现请求下载资源跨域时这个方法就不能实现效果了

方法二:跨域使用将canvas上的内容转换为Blob对象并下载

跨域情况下,由于浏览器的安全策略限制,直接下载图片可能会受到限制。我们可以通过将图片绘制到canvas上,然后将canvas上的内容转换为Blob对象,最后通过创建<a>标签来实现下载。

代码中有详细注释:

// 接收一个图片链接作为参数
function download(link: string) {
  // 创建新的图片对象
  const img = new Image()
  // 设置图片跨域属性为匿名
  img.setAttribute('crossOrigin', 'Anonymous')
  // 图片加载完成后执行回调函数
  img.onload = function () {
    // 创建一个新的画布元素
    const canvas = document.createElement('canvas')
    // 获取画布的2D上下文
    const context = canvas.getContext('2d')
    // 判断是否成功获取到画布上下文
    if (context) {
      // 设置画布的宽度和高度与图片一致
      canvas.width = img.width
      canvas.height = img.height
      // 在画布上绘制图片
      context.drawImage(img, 0, 0, img.width, img.height)
      // 将画布内容转换为 Blob 对象
      canvas.toBlob((blob) => {
        // 判断是否成功生成 Blob 对象
        if (blob) {
          // 创建一个临时链接用于下载
          const url = URL.createObjectURL(blob)
          const a = document.createElement('a')
          const event = new MouseEvent('click')
          // 设置下载的文件名
          a.download = 'default.png'
          // 设置链接地址为 Blob 对象的 URL
          a.href = url
          // 模拟点击事件触发下载
          a.dispatchEvent(event)
          // 释放 Blob 对象的 URL
          URL.revokeObjectURL(url)
        } else {
          console.error('生成 Blob 失败')
        }
      })
    } else {
      console.error('获取 Canvas 上下文失败')
    }
  }
  // 设置图片的 src 属性,并在链接后添加时间戳以避免缓存
  img.src = `${link}?v=${Date.now()}`
}

注:

在canvas中绘制了来自其他域名的图片时,浏览器会认为这个canvas被“污染”(tainted),即受到了跨域限制。在这种情况下,浏览器会禁止使用toBlob()方法导出这个canvas作为Blob对象。

为了解决这个问题,可以在加载图片时设置图片的crossOrigin属性为'Anonymous',这样就可以避免跨域问题。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
layui是一款基于jQuery的前端UI框架,它提供了丰富的组件和样式,方便开发者快速构建美观的网页界面。在layui中,点击图片预览可以通过使用其内置的图片预览组件实现。 要实现点击图片预览,可以按照以下步骤进行操作: 1. 引入layui库和相关样式文件。在HTML文件中,通过`<link>`标签引入layui的CSS样式文件和JS文件。 2. 创建一个包含图片的HTML元素。可以使用`<img>`标签来展示图片。 3. 给图片元素添加`lay-event`属性,并设置为`preview`。这样当点击图片时,layui会自动触发图片预览功能。 4. 初始化layui组件。在JS代码中,使用`layui.use()`方法初始化layui组件。 5. 监听图片预览事件。使用`element.on()`方法监听图片预览事件,并在回调函数中执行相应的操作。 下面是一个示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>点击图片预览</title> <link rel="stylesheet" href="path/to/layui/css/layui.css"> </head> <body> <img src="path/to/image.jpg" lay-event="preview"> <script src="path/to/jquery.js"></script> <script src="path/to/layui/layui.js"></script> <script> layui.use(['layer', 'element'], function(){ var element = layui.element; element.on('nav(preview)', function(elem){ var src = $(elem).attr('src'); // 在这里可以执行图片预览的操作,比如弹出一个大图预览窗口 layer.open({ type: 1, title: false, closeBtn: 0, area: 'auto', skin: 'layui-layer-nobg', // 没有背景色 shadeClose: true, content: '<img src="' + src + '" style="max-width:100%;">' }); }); }); </script> </body> </html> ``` 在上面的示例代码中,我们使用了`layer.open()`方法来实现图片预览的效果。当点击图片时,会弹出一个包含大图的浮层窗口。 希望以上内容能够帮助到你!如果还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值