Open ufologist opened 5 years ago
html2canvas
thirdwx.qlogo.cn
想要获取图片的 base64 数据, 我们大概都知道, 需要将图片绘制到 canvas 上, 再通过 toDataURL 方法拿到 DataURL 数据, 即 base64 的图片数据
base64
canvas
toDataURL
DataURL
CORS
generate-wx-headimgurl-dom-image | gist
crossOrigin
Access-Control-Allow-Origin
onerror
Origin
Disable cache
<img src="http://thirdwx.qlogo.cn/xx/132" crossorigin="anonymous">
canvas.toDataURL
useCORS
src
allowTaint
关于在 HTTPS 的页面中加载 HTTP 的内容, 我们的印象中是所有的 HTTP 的内容都会被浏览器阻止
在开发的过程中需要生成带微信头像的图片, 在 PC 端(因为开发习惯了使用 Disable cache)测试都是可以的, 一到移动端就不行了, 试过很多办法后无果(〒_〒 绝望了...) 突发奇想将微信头像 URL 的 HTTPS 替换成 HTTP, 发现就能够获取到 base64 的数据了, 很是诡异. 现在理清楚背后的故事, 原来是缓存在作怪, 只要不触发浏览器的缓存就能够通过 CORS 跨域机制获取到图片的 base64 的数据
感谢笔记
应用场景
html2canvas
)thirdwx.qlogo.cn
域名, 没有转存到自己的域名下)原理
想要获取图片的
base64
数据, 我们大概都知道, 需要将图片绘制到canvas
上, 再通过toDataURL
方法拿到DataURL
数据, 即base64
的图片数据结论与重点
CORS
跨域CORS
策略示例
generate-wx-headimgurl-dom-image | gist
遇到的坑
crossOrigin
机制, 服务器必须遵循CORS
规范, 返回Access-Control-Allow-Origin
头, 否则会被浏览器阻止(cancel)掉, 触发onerror
回调CORS
规范, 只有在请求时开启Origin
才会返回CORS
规范的内容Disable cache
, 会加载图片失败, 触发onerror
回调onerror
回调(因为我们在页面中先预览了一次微信用户的头像)crossOrigin
机制(但不排除命中其他应用种下的缓存)<img src="http://thirdwx.qlogo.cn/xx/132" crossorigin="anonymous">
crossOrigin
机制), 否则将跨域的图片绘制到canvas
上会导致canvas
被污染, 执行canvas.toDataURL
会因为安全风险而导致执行失败抛出异常html2canvas
的useCORS
选项, 理论上就是运用CORS
机制跨域加载图片base64
数据, 替换掉图片的src
避免产生跨域的问题allowTaint
选项, 会导致生成图片失败补充
关于在 HTTPS 的页面中加载 HTTP 的内容, 我们的印象中是所有的 HTTP 的内容都会被浏览器阻止
参考