跨域圖片使用toDataURL遇坑記。(最終還是解決了)

    這兩天接到一個需求,需要做一個圖片裁剪功能。找到了cropper.js,使用起來算是順手,在做到將截好的圖片以base64的形式上傳保存的時候,突然遇到了一個之前沒有碰到過的問題,沒錯就是:圖片跨域問題。

    網上搜鎖了一下跨域圖片使用toDataURL轉換爲base64的方法,沒錯,想必大家也肯定都知道了。

     給Img標籤設置crossOrign屬性,將值設置爲""或"Anonymous",事實上如果crossOrigin屬性不設置爲“use-credentials”,設置爲其他的值時,都默認等同於“Anonymous”。

    如此設置好後,滿心歡喜的去測試,此時的代碼如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" name="picUrl">
    <button onclick="test()">測試</button>
</body>
<script>
    function test(){
        var url = document.getElementsByName("picUrl")[0].value;
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext('2d');

        canvas.width = 100;
        canvas.height = 100;
        var img = new Image();
        //設置圖片跨域訪問
        img.crossOrigin = 'anonymous';
        img.src = url;
        document.body.appendChild(img);
        img.onload = function () {
            ctx.drawImage(this,0,0,100,100);
            var base64 = canvas.toDataURL('image/jpg', 1);
            console.log(base64)
        };
    }
</script>
</html>

但是結果卻是:

報錯:圖片跨域無權限訪問

百思不得其解,明明都設置好了啊,只好繼續在百度中探索,但是憑藉自己的關鍵字,搜來搜去都是一樣的內容,而且感覺還都是互相複製粘貼的,幾乎都快失望了。終於功夫不負有心人,說是因爲瀏覽器使用本地緩存的問題,需要禁止瀏覽器使用緩存。

如法炮製,在控制檯的network裏將disablecache勾上以後,滿心歡喜的再度嘗試!yeah,OK了。But!!!!反轉又來了,當你將控制檯關掉後,disablecache是無效的,所以說你每次使用這個功能的時候都得開着控制檯,那可真是要了命了,不得被人噴死啊!心情又down了下來,又開始了漫長的搜尋之路。終於終於,讓我看到了一篇帖子,提到了使用時間戳來解決問題,猶如醍醐灌頂啊,最終解決了這個問題。

發這個帖,最主要的原因是自己覺得解決這個問題花費了太多時間,其實就是一個小細節,希望能幫助更多的人節省時間。另一點就是想說,百度搜索出來有效的帖子太少了,都是互相粘貼。

最終版的代碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="text" name="picUrl">
    <button onclick="test()">測試</button>
</body>
<script>
    function test(){
        var url = document.getElementsByName("picUrl")[0].value;
        var canvas = document.createElement("canvas");
        var ctx = canvas.getContext('2d');

        canvas.width = 100;
        canvas.height = 100;
        var img = new Image();
        //設置圖片跨域訪問
        img.crossOrigin = 'anonymous';
        //加時間戳解決跨域問題
        img.src = url+"?timeStamp="+new Date();  <= 解決問題的關鍵點
        document.body.appendChild(img);
        img.onload = function () {
            ctx.drawImage(this,0,0,100,100);
            var base64 = canvas.toDataURL('image/jpg', 1);
            console.log(base64)
        };
    }
</script>
</html>
以上純屬個人見解,如果有什麼不對的地方,請大家指出,誠虛心受教!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章