2012-06-11 112 views
9

HTML5 le permiten almacenar datos localmente, lo que creo que es grande. Por ejemplo aquí es cómo se puede utilizar:convertir los datos binarios en base 64 con javascript

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

En HTML, puede mostrar dinámicamente una imagen por settig su nacimiento hasta:

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

Así que mi pregunta es cómo puedo convertir los datos binarios a una cadena base64 para que pueda aprovechar el almacenamiento local html5?

Por ejemplo que será muy bueno si pudiera:

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

Sé que podría resolver este problema envolviendo la imagen alrededor de un lienzo utilizando html5 convirtiendo después de que a base64string. también puedo hacer un servicio específico en el servidor que envíe datos de cadena base64 de esa imagen (someImagen.aspx). Solo quiero saber si será posible recuperar datos binarios de un servidor y convertirlos en una cadena base64.

+0

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

Respuesta

8

Pruebe la función btoa:

var data = btoa(r); 
+21

Desafortunadamente esto no funciona para datos binarios: Uncaught InvalidCharacterError: Error al ejecutar 'btoa' en 'Ventana': La cadena que va a codificarse contiene caracteres fuera del rango Latin1." –

+0

@BastianVoigt cadenas binarias no contienen charaters fuera Latin1, cada byte es representado por un punto de código entre 0 y 255, que es el rango Latin1. – Esailija

+1

Mi Chrome no está de acuerdo. ¿O por qué me presentaría este mensaje de error? ¿Es porque mi cadena se interpreta como UTF-8 de alguna manera? –

2

Use un FileReader para codificar la imagen como un enlace de datos:

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

funciona muy bien! Estoy usando esto en combinación con 'req = new XMLHttpRequest()', tuve que establecer 'req.responseType = 'blob '' para que funcione. Los datos de blobs están en 'respuesta_responsabilidad' –

7

Para evitar el error 'InvalidCharacterError', que tiene que hacer esto:

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

El método desaprobado unescape() calcula una nueva cadena en la que las secuencias de escape hexadecimales se reemplazan por el carácter que representa. Las secuencias de escape pueden ser introducidas por un . función como escapar porque unescape() está en desuso, utilice decodeURI() o decodeURIComponent lugar – eyalewin

+1

el uso de cualquiera decodeURI y decodeURIComponent causa "Error:. No se pudo ejecutar 'btoa' en 'ventana': la cadena que se va codificada contiene caracteres fuera del Latin1 range ", así que me quedo con unsecape. –

Cuestiones relacionadas