乐于分享
好东西不私藏

前端下载图片

前端下载图片

前端下载图片有很多种方式,取决于你的场景(直接下载、跨域、base64、canvas等)。我给你整理几种常见方案👇


✅ 1. 直接用 <a download>(最简单)

适用于:同源图片 或 已允许跨域的图片

function downloadImage(url, filename = 'image.jpg') {  const a = document.createElement('a');  a.href = url;  a.download = filename;  a.click();}

👉 注意:

如果是跨域图片,服务器必须允许(Access-Control-Allow-Origin否则会变成“打开图片”而不是下载


✅ 2. fetch + blob(推荐通用方案)

适用于:跨域下载(前提是服务器允许 CORS)

async function downloadImage(url, filename = 'image.jpg') {  const res = await fetch(url);  const blob = await res.blob();  const blobUrl = URL.createObjectURL(blob);  const a = document.createElement('a');  a.href = blobUrl;  a.download = filename;  a.click();  URL.revokeObjectURL(blobUrl);}

👉 优点:

可控性强可以做 loading / 进度 / 错误处理


✅ 3. base64 下载

适用于:你已经拿到 base64 数据

function downloadBase64(base64, filename = 'image.png') {  const a = document.createElement('a');  a.href = base64;  a.download = filename;  a.click();}

✅ 4. canvas 转图片下载(常用于截图/处理后下载)

function downloadCanvas(canvas, filename = 'image.png') {  const url = canvas.toDataURL('image/png');  const a = document.createElement('a');  a.href = url;  a.download = filename;  a.click();}

👉 注意:

canvas 如果画了跨域图片且未设置 crossOrigin,会报错(tainted canvas)


✅ 5. 解决跨域图片无法下载(关键点🔥)

如果你遇到这种问题:

图片可以显示,但下载失败 / 变成打开新窗口

解决方案:

✔️ 方法1:后端代理(最稳)

让后端去请求图片,再返回给前端

前端 -> 你的服务器 -> 图片服务器

✔️ 方法2:设置 crossOrigin

const img = new Image();img.crossOrigin = 'anonymous';img.src = url;

⚠️ 前提:图片服务器必须支持 CORS


✅ 6. 批量下载(进阶)

async function batchDownload(urls) {  for (let i = 0; i < urls.length; i++) {    await downloadImage(urls[i], `image_${i}.jpg`);  }}

👉 注意浏览器限制(同时下载过多会被拦截)


🚀 总结(选型建议)

场景
推荐方案
普通图片
<a download>
跨域图片
fetch + blob
base64
直接下载
canvas生成
toDataURL
强制稳定
后端代理