2012-06-11 14 views
9

HTML5 pozwala przechowywać dane lokalnie, co moim zdaniem jest wspaniałe. Na przykład o to, jak można go używać:Konwertuj dane binarne na base64 za pomocą javascript

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

w HTML można dynamicznie wyświetlania obrazu przez settig źródła do:

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

Więc moje pytanie brzmi: jaki sposób można przekonwertować dane binarne do łańcucha base64, aby móc korzystać z lokalnego magazynu HTML 5?

Na przykład to będzie wspaniale, gdyby się dało:

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

wiem mogę rozwiązać ten problem poprzez owinięcie wokół płótnie obraz przy użyciu HTML5 następnie przekształcenie że do base64string. również mogę utworzyć konkretną usługę na serwerze, która wyśle ​​dane ciągu base64 tego obrazu (someImage.aspx). Chcę tylko wiedzieć, czy będzie możliwe pobranie danych binarnych z serwera i przekonwertowanie ich na ciąg base64.

+0

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

Odpowiedz

8

Spróbuj btoa funkcję:

var data = btoa(r); 
+21

Niestety nie działa to w przypadku danych binarnych: Uncaught InvalidCharacterError: Nie powiodło się wykonanie 'btoa' w 'oknie': Łańcuch do zakodowania zawiera znaki spoza zakresu Latin1. " –

+0

Struny binarne BastianVoigt nie zawierają znaków poza Latin1, każdy bajt jest reprezentowany przez punkt kodowy z zakresu od 0 do 255, który jest zasięgiem Latin1. – Esailija

+1

Mój Chrome nie zgadza się. A może pokaże mi ten komunikat o błędzie? Czy to dlatego, że mój ciąg jest w jakiś sposób interpretowany jako UTF-8? –

2

Użyj FileReader zakodować swój wizerunek jako adres URL danych:

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

działa świetnie! używam tego w połączeniu z 'req = new XMLHttpRequest()', musiałem ustawić 'req.responseType = 'blob Aby to zadziałało Dane blob są w 'req.response' –

7

Aby uniknąć błędu 'InvalidCharacterError', trzeba to zrobić:

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

Metoda przestarzała unescape() oblicza nowy ciąg, w którym szesnastkowe sekwencje specjalne są zastępowane przez znak, który reprezentuje. Ponieważ unescape() jest przestarzałe, użyj zamiast tego decodeURI() lub decodeURIC Component: – eyalewin

+1

Użycie decodeURI i decodeURIComponent powoduje "Błąd: nie udało się wykonać 'btoa' on 'Window': Ciąg do zakodowania zawiera znaki spoza Zakres Latin1 ", więc trzymam się unsecape. –

Powiązane problemy