2012-12-21 11 views
11

Da quando Amazon ha attivato CORS, mi chiedevo se fosse possibile.carica dati su canvas su s3

I dati HTML canvas (sul browser del client) possono essere convertiti in un something e caricati direttamente in s3?

Sono sicuro di poter effettuare una richiesta su Amazon ma che richiede uno File.

Posso ottenere dati immagine codificati base64 o anche un Blob ma c'è un modo per salvarlo come immagine su S3 dal browser client?

C'è un modo per convertire canvas-File modo che io possa fare una richiesta PUT o un modo che Amazon capisce Blob e lo salva come immagine?

+1

È possibile farlo. abbastanza lungo da spiegare qui. Ma se qualcuno è interessato lo scriverò. –

+0

Mi piacerebbe sapere come hai convertito il 'dataURL' in un blob riconosciuto da amazon. –

+1

@RaphaelRafatpanah 'function canvasToBase64 (canvas_id) { var base64 =" " try { base64 = document.getElementById (canvas_id) .toDataURL ('image/jpeg', 0.8); } catch (e) { // Fallback se la conversione jpeg non è supportata base64 = document.getElementById (canvas_id) .toDataURL(); } // rimuovere il tipo di formato base64 = base64.replace (/^dati: image \/(png | jpg | jpeg); base64, /, ""); ritorno base64; } ' –

risposta

-3

Il modo più semplice per risparmiare tela è per convertirlo in Base64:

canvas.toDataURL(); 

oppure si può impostare il tipo di immagine tramite argomento:

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

guardare anche questo lib: http://www.nihilogic.dk/labs/canvas2image/

+0

L'OP ha già dichiarato di essere in grado di ottenere i dati codificati Base64 (e sono ovviamente a conoscenza della funzione' atob'). – katspaugh

+0

cosa devo fare con 'base64'? Voglio che venga salvato come file su 's3' –

11

Questo è ciò che ha funzionato per me:

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.'); 
        }); 

E

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

Grazie Jungli. Mi hai salvato la vita. – WonderKid

+0

Mi sento come se mi mancasse qualcosa di stupido qui, ma dove vengono definiti 'file.name' e' file.type'?Sembra che dovrebbero essere una stringa (hardcoded) per il nome del file e "image/jpeg" 'per ContentType? –