JavaScript 使用链接跨域下载图片
本文介绍如何在 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', '测试')
注意事项
注意
如果浏览器提示跨域错误,说明后台服务器未正确配置跨域策略,需在后端进行相应的跨域设置。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
为什么叫JavaScript:语言命名由来及与Java的历史渊源
2026-11-05 11:37:48
JS获取当前时间年月日时分秒并格式化为YYYY-MM-DD HH:mm:ss
2026-11-04 21:25:21
不同语言间JS与Java/Python加密结果不一致怎么办
2026-11-04 18:27:23
Mock.js 拦截 Axios 和 Fetch 请求的原理与配置方法
2026-11-04 08:13:59
JS怎么获取当前日期并格式化为YYYY-MM-DD
2026-11-03 18:47:03
