Vue下载图片报No 'Access-Control-Allow-Origin'跨域错误如何解决?
报错原因
这个跨域错误本质是图片资源所在的服务端没有配置CORS规则,未返回Access-Control-Allow-Origin响应头允许你的前端站点跨域访问资源。你在前端给Image标签添加crossOrigin: anonymous仅能告知浏览器按照跨域规则发送请求,无法绕过服务端的跨域限制。
解决方案
方案1:修改图片服务端配置(最优方案)
联系图片存储服务的运维人员,将你的前端域名添加到CORS访问白名单中,如果是公开可访问的图片资源,也可以直接配置Access-Control-Allow-Origin: *,同时需要确保服务端允许OPTIONS类型的预检请求。配置完成后你现有的下载代码无需修改即可正常运行。方案2:通过自有后端代理转发请求
如果你没有图片服务端的修改权限,可以在自己项目的后端新增一个代理接口:前端先请求同域名下的这个代理接口,由后端服务去请求目标图片资源,再将图片二进制流返回给前端,避免跨域。你可以将原有下载逻辑调整为如下代码:export function downloadPhoto (imgsrc) { // /api/proxy-img为你后端新增的代理接口,将原图地址作为参数传入 fetch(`/api/proxy-img?url=${encodeURIComponent(imgsrc)}`) .then(res => res.blob()) .then(blob => { const downloadUrl = URL.createObjectURL(blob) const a = document.createElement('a') a.href = downloadUrl a.download = 'photo' a.click() URL.revokeObjectURL(downloadUrl) }) }方案3:开发环境临时调试方案
仅用于本地开发阶段调试使用,你可以在Vue项目的vue.config.js中配置开发服务代理,将图片请求转发到目标服务端,配置示例如下:// vue.config.js module.exports = { devServer: { proxy: { '/static-img': { target: 'https://你的图片存储服务域名', changeOrigin: true, pathRewrite: { '^/static-img': '' } } } } }调用下载方法时,将图片地址的域名部分替换为
/static-img前缀即可,该方案仅在本地开发环境生效,生产环境仍需要使用前两种方案。
内容的提问来源于stack exchange,提问作者Chestnut
相关产品推荐
相关产品推荐

