Recuperar contenido de archivos binarios usando Javascript, codificarlo en base64 y decodificarlo en reversa usando Python
Estoy intentando descargar un archivo binario usandoXMLHttpRequest
(usando un Webkit reciente) y codifique base64 sus contenidos usando esta función simple:
function getBinary(file){
var xhr = new XMLHttpRequest();
xhr.open("GET", file, false);
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.send(null);
return xhr.responseText;
}
function base64encode(binary) {
return btoa(unescape(encodeURIComponent(binary)));
}
var binary = getBinary('http://some.tld/sample.pdf');
var base64encoded = base64encode(binary);
omo nota al margen, todo lo anterior es material estándar de Javascript, incluidobtoa()
yencodeURIComponent()
: https: //developer.mozilla.org/en/DOM/window.bto
Esto funciona bastante bien, e incluso puedo decodificar los contenidos de base64 usando Javascript:
function base64decode(base64) {
return decodeURIComponent(escape(atob(base64)));
}
var decodedBinary = base64decode(base64encoded);
decodedBinary === binary // true
Ahora, quiero decodificar los contenidos codificados en base64 usando Python que consume alguna cadena JSON para obtener elbase64encoded
valor de cadena. Ingenuamente, esto es lo que hago:
import urllib
import base64
# ... retrieving of base64 encoded string through JSON
base64 = "77+9UE5HDQ……………oaCgA="
source_contents = urllib.unquote(base64.b64decode(base64))
destination_file = open(destination, 'wb')
destination_file.write(source_contents)
destination_file.close()
Pero el archivo resultante no es válido, parece que la operación está desordenada con UTF-8, codificación o algo que todavía no está claro para mí.
Si intento decodificar los contenidos de UTF-8 antes de ponerlos en el archivo de destino, se genera un error:
import urllib
import base64
# ... retrieving of base64 encoded string through JSON
base64 = "77+9UE5HDQ……………oaCgA="
source_contents = urllib.unquote(base64.b64decode(base64)).decode('utf-8')
destination_file = open(destination, 'wb')
destination_file.write(source_contents)
destination_file.close()
$ python test.py
// ...
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 0: ordinal not in range(128)
Como nota al margen, aquí hay una captura de pantalla de dos representaciones textuales de un mismo archivo; a la izquierda: el original; a la derecha: el creado a partir de la cadena decodificada en base64:http: //cl.ly/0U3G34110z3c132O2e2
¿Existe algún truco conocido para evitar estos problemas con la codificación al intentar recrear el archivo? ¿Cómo lo lograrías tú mismo?
Cualquier ayuda o sugerencia muy apreciada:)