2012-06-11 13 views
9

HTML5 ti consente di memorizzare i dati localmente che ritengo sia ottimo. Per esempio ecco come si può utilizzare:Converti i dati binari in base64 con javascript

 var store = window.localStorage; 
     store.setItem('foo', "hellow world"); 
     var test = store.getItem('foo'); 
     // test should = "hellow world" 

In HTML è possibile visualizzare in modo dinamico un'immagine settig sorgente:

 "data:image/jpg;base64," + (base64string) 

Quindi la mia domanda è come posso convertire i dati binari su una stringa base64 in modo da poter sfruttare l'archiviazione locale html5?

Per esempio sarà grande se potessi:

$.ajax({ 
    url: 'someImage.png', 
    type: 'POST', 
    success: function (r) { 

       // here I want to convert r to a base64 string ! 
       // r is not binary so maybe I have to use a different approach 
       var data = ConvertToBase64(r); 



       document.getElementById("img").src = "data:image/png;base64," + data; 
      }, 
}); 

So che avrei potuto risolvere questo problema avvolgendo l'immagine attorno una tela utilizzando HTML5 quindi la conversione che per base64string. inoltre posso creare un servizio specifico sul server che invierà i dati di stringa base64 di quell'immagine (someImage.aspx). Voglio solo sapere se sarà possibile recuperare i dati binari da un server e convertirli in una stringa base64.

+0

Vedere questo post: http://stackoverflow.com/questions/7370943/retrieving-binary-f ile-content-using-javascript-base64-encode-it-and-reverse-de – Constantine

risposta

8

Prova la funzione btoa:

var data = btoa(r); 
+21

Sfortunatamente questo non funziona con i dati binari: Uncaught InvalidCharacterError: Impossibile eseguire 'btoa' su 'Window': La stringa da codificare contiene caratteri al di fuori dell'intervallo Latin1. " –

+0

@BastianVoigt le stringhe binarie non contengono caratteri all'esterno di Latin1, ogni byte è rappresentato da un punto di codice compreso tra 0 e 255, che corrisponde all'intervallo Latin1. – Esailija

+1

My Chrome non è d'accordo. O perché mi dovrebbe presentare questo messaggio di errore? È perché la mia stringa è interpretata come UTF-8 in qualche modo? –

2

Utilizzare un FileReader per codificare l'immagine come un URL di dati:

jQuery.ajax({...}) 
.done(function (r) { 
    var reader = new FileReader(
    reader.onload = (function(self) { 
    return function(e) { 
     document.getElementById("img").src = e.target.result; 
    } 
    })(this); 
    reader.readAsDataURL(new Blob([r])); 
}); 
+1

funziona alla grande! Sto usando questo in combinazione con 'req = new XMLHttpRequest()', ho dovuto impostare 'req.responseType = 'blob '' per farlo funzionare. I dati blob sono in 'req.response' –

7

Per evitare errori 'InvalidCharacterError', devi fare questo:

var base64EncodedStr = btoa(unescape(encodeURIComponent(rawData))); 
+0

Il metodo unescape() deprecato calcola una nuova stringa in cui le sequenze di escape esadecimali vengono sostituite con il carattere che rappresenta. Le sequenze di escape potrebbero essere introdotte da un funzione come escape, poiché unescape() è deprecato, utilizzare invece decodeURI() o decodeURIComponent. – eyalewin

+1

Utilizzo di decodeURI e decodeURIComponent causa "Errore: impossibile eseguire" btoa "su" Window ": la stringa da codificare contiene caratteri al di fuori del Latin1 range ", quindi mi sto incollando con unsecape. –

Problemi correlati