記一次canvas由于本地緩存引起的CORS跨域問題

我在使用canvas進(jìn)行繪畫涂鴉開發(fā)的過程中,將圖片作為canvas的背景圖,在保存畫布的時候想將背景圖和當(dāng)前畫布內(nèi)容進(jìn)行整合的時候,發(fā)生加載背景圖的跨域錯誤
代碼如下:

export function drawImageHandle(context, url, sx, sy, sw,sh,dx,dy,dw ,dh ) {
  return new Promise((resolve, reject) => {
    const myImage = new Image();
    myImage.setAttribute("crossOrigin", "anonymous");
    myImage.src = url;
    myImage.onload = function() {
      if (dx || dy|| dw || dh) {
        context.drawImage(
          myImage,sx, sy, sw,sh,dx,dy,dw,dh
        );
      } else {
        context.drawImage(
          myImage,sx, sy, sw,sh
        );
      }
      resolve(myImage);
    };
    myImage.onerror = function() {
      reject(myImage)
    }
  });
}
drawImageHandle(
                context,
                this.design.modelImage,
                0,
                0,
                this.design.backImageWidth,
                this.design.backImageHeight
              ).then(() => {
                /**  測試 start */
                // let test = canvas.toDataURL("image/png");
                // let img = document.getElementById("avatar");
                // img.setAttribute("src", test);  // 測試
                // this.$toast.clear();
                // return false;
                /** 測試 end*/
                let base64 = canvas.toDataURL("image/png");
                 const file = base64toFile(base64, new Date().getTime());
                 const formData = new FormData();
                 formData.append('multipartFile' , file);
                 uploadAPI(formData).then((response) => { // response 上傳成功后 返回得圖片路徑地址
                   this.cartAnimationHandle(response.data)
                 }).finally(() => { this.$toast.clear();})
              })

報錯如下:


image.png

我百思不得其解,明明已經(jīng)設(shè)置了

imgs.setAttribute('crossOrigin', 'anonymous');

在阿里云的oss存儲里也設(shè)置了跨域訪問,為什么還是會報跨域錯誤

經(jīng)過一頓折騰后明白了,原來第一次設(shè)置背景圖的時候相當(dāng)于<img>標(biāo)簽,并不會跨域,但是瀏覽器將加載的背景圖緩存了起來,

當(dāng)再通過Image對象加載圖片的時候,瀏覽器自身會監(jiān)測發(fā)現(xiàn)有緩存圖片,但是又與當(dāng)前域名不一致認(rèn)為當(dāng)前是跨域訪問,這里即便是服務(wù)端設(shè)置允許跨域也沒有辦法
最后最后解決辦法來了

既然是瀏覽器本地緩存的鍋,那就不和瀏覽器的緩存玩了,

在用Image對象加載圖片的時候在src 地址后面拼接一個時間戳就OK了,如下

le imgs = new Image();

imgs.setAttribute('crossOrigin', 'anonymous');

imgs.onload = function(){

//實(shí)現(xiàn)自己業(yè)務(wù)

}

imgs.src = this_.dataInfo.imgSrc+'?tamp='+(new Date()).valueOf();
重點(diǎn)就是將圖片的地址后面增加時間戳參數(shù),從而繞過緩存

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容