解決將網(wǎng)絡(luò)圖片轉(zhuǎn)成base64格式報跨域的問題

此前開發(fā)了一個前端生成海報的功能。但是由于海報的圖片是網(wǎng)絡(luò)路徑的圖片。所以在生成海報前需要把網(wǎng)絡(luò)圖片轉(zhuǎn)成base64格式。
但是在轉(zhuǎn)的途中。。發(fā)現(xiàn),報跨域了。。。然后百度了一大堆看似靠譜的方法。

                let that = this
                let image = new Image();  
                image.src = 'xxx'; 
                console.log(image)
                image.onload = function(){  
                  let base64 = that.getBase64Image(image);  
                  console.log(base64);  
                } 
     getBase64Image(img) {
                 let canvas = document.createElement("canvas");  
                 canvas.width = img.width;  
                 canvas.height = img.height;  
                 let ctx = canvas.getContext("2d");  
                 ctx.drawImage(img, 0, 0, img.width, img.height);  
                 let ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();  
                 let dataURL = canvas.toDataURL("image/"+ext);  
                 return dataURL;  
            }

本來以為行了。然后打開控制臺一看。canvas在轉(zhuǎn)base64的時候跨域了。

Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported

百度了一下說給圖片添加一個crossOrigin='Anonymous'就可以解決跨域。

   let that = this
                let image = new Image();  
                image.src = 'xxx'; 
                console.log(image)
                image.crossOrigin='Anonymous'
                image.onload = function(){  
                  let base64 = that.getBase64Image(image);  
                  console.log(base64);  
                } 
     getBase64Image(img) {
                 let canvas = document.createElement("canvas");  
                 canvas.width = img.width;  
                 canvas.height = img.height;  
                 let ctx = canvas.getContext("2d");  
                 ctx.drawImage(img, 0, 0, img.width, img.height);  
                 let ext = img.src.substring(img.src.lastIndexOf(".")+1).toLowerCase();  
                 let dataURL = canvas.toDataURL("image/"+ext);  
                 return dataURL;  
            }

但是加上后發(fā)現(xiàn)依舊是跨域。這下就頭疼了。

后面偶然一次瞎操作,把crossOrigin='Anonymous'給提到了賦值src的前面。
也就是

                let image = new Image();  
                image.crossOrigin='Anonymous'
                image.src = 'http://group.app65.cn/upload/admin/20210413/66826bc7adbc3c595c9b169d955cc3e9.png'; 
                console.log(image)
                image.onload = function(){  
                  let base64 = that.getBase64Image(image);  
                  console.log(base64);  
                } 

結(jié)果竟然成功了。。。。。

附:如果服務(wù)端沒有給圖片設(shè)置請求頭里的Access-C...A...O...字段的值為*或者你當(dāng)前的域名。就算前端搞了這個跨域的玩意兒上去,依舊是拿不到圖片的。

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

相關(guān)閱讀更多精彩內(nèi)容

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