2012-12-21 2 views
11

Теперь, когда амазонка включилась CORS Мне было интересно, возможно ли это.Загрузка данных холста в s3

Может ли html canvas данные (в браузере клиента) быть преобразованы в something и загружены непосредственно на s3?

Я уверен, что могу сделать запрос на амазонку PUT, но для этого требуется File.

Я могу получить base64 данные кодированного изображения или даже Blob, но есть ли способ сохранить это как изображение в S3 из браузера клиента?

Есть ли способ, чтобы преобразовать canvas в File так, что я могу сделать PUT запрос или способом, которым амазонка понимает Blob и сохраняет его как изображение?

+1

Это можно сделать. довольно долго объяснять здесь. Но если кто-то заинтересован, я запишу его. –

+0

Мне бы хотелось узнать, как вы преобразовали 'dataURL' в blob, который распознает амазонка. –

+1

@RaphaelRafatpanah 'функция canvasToBase64 (canvas_id) { var base64 =" " try { base64 = document.getElementById (canvas_id) .toDataURL ('image/jpeg', 0.8); } catch (e) { // Возврат в случае, если преобразование jpeg не поддерживается base64 = document.getElementById (canvas_id) .toDataURL(); } // удалите тип формата base64 = base64.replace (/^data: image \/(png | jpg | jpeg); base64, /, ""); return base64; } ' –

ответ

-3

Самый простой способ сохранить холст, чтобы преобразовать его в base64:

canvas.toDataURL(); 

или вы можете установить тип изображения с помощью аргумента:

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

смотреть Также этот LIB: http://www.nihilogic.dk/labs/canvas2image/

+0

OP уже сказал, что они могут получить данные с кодировкой Base64 (и они, очевидно, знают о функции atob). – katspaugh

+0

Что мне делать с 'base64'? Я хочу, чтобы он был сохранен как файл на 's3' –

11

Это то, что работает для меня:

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

Спасибо Jungli. Вы спасли мою жизнь. – WonderKid

+0

Чувствую, что мне здесь что-то не хватает, но где определяются 'file.name' и' file.type'?Кажется, что они должны быть (жестко запрограммированной) строкой для имени файла и "image/jpeg" для ContentType? –

Смежные вопросы