Recuperando o conteúdo do arquivo binário usando Javascript, base64 codifica-o e decodifique-o reversamente usando Python
Estou tentando baixar um arquivo binário usandoXMLHttpRequest
(usando um Webkit recente) e codifique base64 seu conteúdo usando esta função simples:
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);
Como observação, tudo o que está descrito acima é material Javascript padrão, incluindobtoa()
eencodeURIComponent()
: https: //developer.mozilla.org/en/DOM/window.bto
Isso funciona muito bem, e posso até decodificar o conteúdo da base64 usando Javascript:
function base64decode(base64) {
return decodeURIComponent(escape(atob(base64)));
}
var decodedBinary = base64decode(base64encoded);
decodedBinary === binary // true
gora, eu quero decodificar o conteúdo codificado em base64 usando Python, que consome alguma string JSON para obter obase64encoded
valor da string. Ingenuamente é isso que eu faço:
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()
Mas o arquivo resultante é inválido, parece que a operação foi alterada com UTF-8, codificação ou algo que ainda não está claro para mim.
Se eu tentar decodificar o conteúdo UTF-8 antes de colocá-lo no arquivo de destino, ocorrerá um erro:
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 observação, aqui está uma captura de tela de duas representações textuais de um mesmo arquivo; à esquerda: o original; à direita: o criado a partir da string decodificada em base64:http: //cl.ly/0U3G34110z3c132O2e2
Existe um truque conhecido para contornar esses problemas com a codificação ao tentar recriar o arquivo? Como você conseguiria isso sozinho?
Qualquer ajuda ou dica muito apreciada