JavaScript 使用链接跨域下载图片

作者:阿沐

时间:2026-10-23

浏览:186

本文介绍如何在 JavaScript 中通过链接跨域下载图片。核心步骤包括设置 img.crossOrigin 为 anonymous 以获取 CORS 授权,利用 Canvas 的 toDataURL() 将图片转为 Base64,最后通过模拟点击 A 标签实现下载。若遇跨域错误,需确保后端服务器配置了相应的 Access-Control-Allow-Origin 响应头。

文章目录

前言

前言

图片作为常见的静态资源,来源多样,包括本地文件、外部链接或 Base64 编码数据。在 Web 开发中,常需将图片转换为 Base64 格式以便处理。通过 Canvas 的 toDataURL() API 可将图片转为 Base64,进而模拟用户点击事件完成下载操作。

外链下载原理

外链下载

当从本地或网站下载外部链接图片时,会涉及跨域问题。出于隐私保护,浏览器默认限制跨域请求。为此,需将图片的 crossOrigin 属性设置为 anonymous,以允许跨域加载。此时,浏览器会在请求头中附加 Origin 信息,告知静态资源服务器需要在响应头中返回 Access-Control-Allow-Methods 和 Access-Control-Allow-Origin 字段,从而允许浏览器放行该请求。

代码实现示例

代码示例如下

eventEmitter.js


/*
 * 事件触发器
 * @Author: wujiang
 * @Date: 2018-11-11 22:50:43
 * @Last Modified by: wujiang
 * @Last Modified time: 2018-11-11 23:39:40
 */
const EventEmitter = require('events')
class MyEmitter extends EventEmitter {}

const myEmitter = new MyEmitter()

export default myEmitter

backend.js


import eventEmitter from './common/eventEmitter'
// 图片下载对象
let downloadedImg = null
// 待下载文件名
let fileName = null

// 监听是否获取图片地址
eventEmitter.addListener('getHref', href => {
 imatateDownloadByA(href, fileName)
})

/**
 * base64下载图片(可跨域)
 * @param {*} img
 * @param {String} filename 文件名
 */
function downloadImg (imgUrl, filename) {
 fileName = filename
 startDownloadImg(imgUrl, getImgDataUrl)
}

/**
 * 开始下载图片之前
 * @param {String} imgUrl
 * @param {Function} callback
 */
function startDownloadImg (imgUrl, callback) {
 let imageURL = imgUrl
 downloadedImg = new Image()
 downloadedImg.crossOrigin = 'Anonymous'
 downloadedImg.src = imageURL
 downloadedImg.addEventListener('load', callback, false)
}

/**
 * 获取图片下载base64字符串
 * @param {DOMimg} domimg
 */
function getImgDataUrl () {
 const canvas = document.createElement('canvas')
 const context = canvas.getContext('2d')
 const width = downloadedImg.width || downloadedImg.naturalWidth
 const height = downloadedImg.height || downloadedImg.naturalHeight
 const imgSrc = downloadedImg.src
 let type = imgSrc.substring(imgSrc.lastIndexOf('.') + 1)
 let dtype = type === 'jpg' ? 'jpeg' : 'png'
 canvas.width = width
 canvas.height = height
 context.drawImage(downloadedImg, 0, 0)
 eventEmitter.emit('getHref', canvas.toDataURL(`image/${dtype}`))
}

/**
 * 通过a标签模拟下载
 * @param {String} href
 * @param {String} filename
 */
function imatateDownloadByA (href, filename) {
 const a = document.createElement('a')
 a.download = filename
 a.style.display = 'none'
 a.href = href
 document.body.appendChild(a)
 a.click()
 a.remove()
 window.URL.revokeObjectURL(href)
}

downloadImg('https://img.alicdn.com/imgextra/i2/54199406/O1CN012JLzreAxzn1xhNP_!!54199406.jpg', '测试')

注意事项

注意

如果浏览器提示跨域错误,说明后台服务器未正确配置跨域策略,需在后端进行相应的跨域设置。

前言

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章