2012-09-05 33 views
6

Tôi nhận được lỗi javascript sau khi tôi cố gắng để có được dữ liệu từ một yếu tố canvas:HTML5 Canvas kiểm soát truy cập-Allow-Origin lỗi

Error: canvas.toDataURL() not supported. [Exception... "The operation is insecure." code: "18" nsresult: "0x80530012 (SecurityError)"...

Các canvas được rút ra từ một hình ảnh phục vụ từ một khác nhau tên miền, nhưng tôi đang sử dụng proxy để thêm 2 dòng này vào tiêu đề phản hồi hình ảnh:

access-control-allow-origin: *

access-control-allow-credentials: true

Tôi đang thiếu gì?

Cảm ơn,
Ted

+0

Uhh cách chính xác sử dụng proxy của bạn. Trừ khi bạn đang sử dụng dịch vụ nhắn tin iframe/miền phụ giữa nhiều miền, nó sẽ thất bại – Kpower

+0

Tôi đang sử dụng Charles (http://www.charlesproxy.com) trên máy tính để bàn của mình làm proxy để giải quyết các tiêu đề phản hồi hình ảnh (thêm dòng truy cập-kiểm soát-cho phép-nguồn gốc). Đây chỉ là cho dev. Nếu nó hoạt động, tôi sẽ yêu cầu thay đổi các tiêu đề của máy chủ hình ảnh để có thêm các dòng gốc cho phép kiểm soát truy cập.
Sự hiểu biết của tôi là nếu tiêu đề phản hồi hình ảnh có các dòng truy cập-cho phép-xuất xứ, thì javascript của tôi có thể chỉnh sửa canvas. –

+3

Cuối cùng tôi đã tìm thấy nó. Phần bị thiếu là thiết lập thuộc tính crossOrigin của hình ảnh thành "Ẩn danh". Thông tin thêm tại đây: https://developer.mozilla.org/en-US/docs/CORS_Enabled_Image –

Trả lời

1

Để thực hiện một yêu cầu CORS thích hợp, bạn phải thiết lập để "Anonymous" của cross origin property hình ảnh. This example là từ Mạng nhà phát triển Mozilla.

var img = new Image, 
    canvas = document.createElement("canvas"), 
    ctx = canvas.getContext("2d"), 
    src = "http://example.com/image"; // insert image url here 

img.crossOrigin = "Anonymous"; 

img.onload = function() { 
    canvas.width = img.width; 
    canvas.height = img.height; 
    ctx.drawImage(img, 0, 0); 
    localStorage.setItem("savedImageData", canvas.toDataURL("image/png")); 
} 
img.src = src; 
// make sure the load event fires for cached images too 
if (img.complete || img.complete === undefined) { 
    img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="; 
    img.src = src; 
} 

Hỗ trợ trình duyệt loại trừ mọi phiên bản đã biết của IE và các phiên bản Safari chưa được phát hành. Firefox và Chrome có nhiều năm hỗ trợ.