1. 问题描述:

测试环境项目可以正常运行,生成环境img.onload()失败,导致canvas不能合成图。

2. 测试环境配置

BASE_URL:

  1. https://api-zepeto-beta.kajicam.com/zepeto/activity/photo/api

CDN_PREFIX:

  1. https://test-img.xiaoban.ren/

3. 生产环境配置

BASE_URL:

  1. https://api-zepeto.kajicam.com/zepeto/activity/photo/api

CDN_PREFIX:

  1. https://zepeto-android.kajicam.com/

4. H5崽崽App内报错信息
  1. Event {isTrusted: true}
  2. isTrusted: true
  3. __proto__: EventPrototype

5. 代码
  1. loadImage(src) {
  2. return new Promise((resolve, reject) => {
  3. const img = new Image()
  4. img.crossOrigin = 'anonymous'
  5. img.onload = (res) => {
  6. resolve(img)
  7. }
  8. img.onerror = (err) => {
  9. errMsg({text: '图片加载失败,请检查网络'})
  10. reject(err)
  11. }
  12. // img.src = src;
  13. img.src = src + "?v=" + Date.now() // 不加时间戳会报错
  14. console.log('img.src:', img.src)
  15. if(img.complete) {
  16. resolve(img)
  17. }
  18. });
  19. }

6. 解决思路与办法:
  1. 仅将接口域名图片CDN前缀,由测试环境的修改为生产环境的,项目便不能运行了,图片在浏览器上可以正常访问显示,所以假设两个环境配置不同。
  2. 找运维同学协助对比两个环境的配置,提供报错信息和H5这边不同环境的配置信息。(找人帮忙描述清楚问题,提供充足信息

7. 加餐,load图片报403,因为OSS开启了白名单
  1. var img = new Image()
  2. img.src = 'https://zepeto-android.kajicam.com/zepeto/activity/photo/template/1582627064503.png?v=10';
  3. img.onload = function() {
  4. console.log('img load suc');
  5. }
  6. // 在浏览器中执行该段代码,报403
  1. var img = new Image()
  2. img.src = 'https://zepeto-android.kajicam.com/zepeto/activity/photo/template/1582627064503.png';
  3. img.onload = function() {
  4. console.log('img load suc');
  5. }
  6. // 在浏览器中执行该段代码,报403
  1. var img = new Image()
  2. img.src = 'https://test-img.xiaoban.ren/zepeto/activity/photo/template/1582543651956.png';
  3. img.onload = function() {
  4. console.log('img load suc');
  5. }
  6. // 在浏览器中执行该段代码,报403

结论:

load图片报403错误,原因是OSS开启了白名单。

8. OSS配置备忘

h5-activity-beta, h5-activity-prod, xiaoban.ren 默认关闭了白名单和设置了允许跨域。