2012-12-21 42 views
11

Bây giờ kể từ khi amazon đã bật CORS Tôi đã tự hỏi nếu điều này là có thể.tải lên dữ liệu canvas vào s3

Có thể html trực tiếp canvas dữ liệu (trên trình duyệt của khách hàng) được chuyển đổi thành something và được tải lên s3 trực tiếp không?

Tôi chắc chắn tôi có thể thực hiện yêu cầu PUT thành amazon nhưng yêu cầu File.

Tôi có thể nhận được base64 dữ liệu hình ảnh được mã hóa hoặc thậm chí là Blob nhưng có cách nào để lưu hình ảnh này dưới dạng ảnh S3 từ trình duyệt của khách hàng không?

Có cách nào để chuyển đổi canvas thành File để tôi có thể thực hiện yêu cầu PUT hoặc cách amazon hiểu Blob và lưu nó dưới dạng hình ảnh không?

+1

Có thể thực hiện. khá dài để giải thích ở đây. Nhưng nếu có ai quan tâm, tôi sẽ viết nó xuống. –

+0

Tôi rất muốn biết cách bạn chuyển đổi 'dataURL' thành một đốm màu mà amazon nhận ra. –

+1

@RaphaelRafatpanah 'function canvasToBase64 (canvas_id) { var base64 =" " thử { base64 = document.getElementById (canvas_id) .toDataURL ('image/jpeg', 0.8); } bắt (e) { // Dự phòng nếu chuyển đổi jpeg không được hỗ trợ base64 = document.getElementById (canvas_id) .toDataURL(); } // xóa loại định dạng base64 = base64.replace (/^dữ liệu: hình ảnh \/(png | jpg | jpeg); base64, /, ""); trả về base64; } ' –

Trả lời

-3

Cách dễ nhất để tiết kiệm vải là để chuyển nó sang base64:

canvas.toDataURL(); 

hoặc bạn có thể đặt loại hình ảnh qua đối số:

canvas.toDataURL("image/png"); 
canvas.toDataURL("image/jpeg"); 
// etc 

Cũng xem lib này: http://www.nihilogic.dk/labs/canvas2image/

+0

OP đã cho biết họ có thể nhận được dữ liệu được mã hóa Base64 (và rõ ràng là họ biết về hàm' atob'). – katspaugh

+0

Tôi phải làm gì với 'base64'? Tôi muốn nó được lưu dưới dạng một tệp tại 's3' –

11

Đây là những gì làm việc cho tôi:

var canvas = document.getElementById("imagePreviewChatFooter"); 
        var dataUrl = canvas.toDataURL("image/jpeg"); 
        var blobData = dataURItoBlob(dataUrl); 
        var fileName = file.name; 
        var params = {Key: fileName, ContentType: file.type, Body: blobData}; 
        bucket.upload(params, function (err, data) { 
         console.log(data); 
         console.log(err ? 'ERROR!' : 'UPLOADED.'); 
        }); 

function dataURItoBlob(dataURI) { 
    var binary = atob(dataURI.split(',')[1]); 
    var array = []; 
    for(var i = 0; i < binary.length; i++) { 
     array.push(binary.charCodeAt(i)); 
    } 
    return new Blob([new Uint8Array(array)], {type: 'image/jpeg'}); 
} 
+0

Cảm ơn bạn Jungli. Bạn đã cứu cuộc đời tôi. – WonderKid

+0

Tôi cảm thấy như tôi đang thiếu một cái gì đó câm ở đây, nhưng nơi 'file.name' và' file.type' được xác định?Có vẻ như họ phải là một chuỗi (hardcoded) cho tên tệp và '" image/jpeg "' cho ContentType? –

Các vấn đề liên quan