我需要將遠程圖像轉換爲base64給定其URL,但我遇到CORS錯誤,不知道如何解決。CORS錯誤試圖將遠程圖像轉換爲base64數據
我已經按照一些關於這個問題的解決方案:How to convert image into base64 string using javascript
我的例子形象是:https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg
方法1(的FileReader):
function toDataUrl(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var reader = new FileReader();
reader.onloadend = function() {
callback(reader.result);
}
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
toDataUrl('https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg', function(data) { console.log(data)});
這會產生錯誤:
XMLHttpRequest cannot load https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg . No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://stackoverflow.com ' is therefore not allowed access.
方法2(畫布)
function toDataUrl(src, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'use-credentials';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
};
img.src = src;
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
}
toDataUrl('https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg', function(data) { console.log(data)});
可生產嘗試加載圖像時,類似的錯誤:
3210與也試過:
img.crossOrigin = 'anonymous';
,得到了相同的結果。
方法3(帆布使用img元素):
img = document.createElement('img');
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.height;
canvas.width = this.width;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL('image/jpg');
console.log(dataURL);
};
img.src = 'https://blog.xenproject.org/wp-content/uploads/2014/10/Testing.jpg';
這樣至少加載圖像,但未能上調用toDataURL有:
Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. at HTMLImageElement.img.onload (:9:22)
順便說一句,我不確定CORS政策在此保護的是什麼。假設有某種可能觸發漏洞的惡意負載。我們仍然在DOM中加載和顯示圖像,爲什麼我們會相信由同一端點設置的CORS頭?
有沒有人知道這個問題的任何解決方案?
感謝您的任何幫助。
如果您無法控制服務器,則必須通過您自己的服務器端代理來獲取內容。您看到的這些錯誤是標準的瀏覽器安全措施,並且它們無法解決(在客戶端代碼中)。 – Pointy
CORS問題是服務器端問題..它沒有響應正確的標題.. https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image –
「我不確定究竟是什麼CORS政策正在保護這裏。「 - 同源策略保護它始終保護的內容:您的JavaScript從第三方讀取潛在的敏感數據。您可以*顯示*圖像,因爲它不會讓您將數據複製到您的服務器。只有瀏覽器和圖像來自的服務器才能觸摸它。 – Quentin