Mam ciąg base64, który dekodowałem i chcę umożliwić użytkownikowi zapisanie go jako pliku. W szczególności, gdy sprawdzam długość dekodowanej zawartości, to 11271 bajtów.javascript: pobrany rozmiar pliku inny niż długość zawartości
var content = messageObj['data'];
var decodedContent = atob(content);
console.log(decodedContent.length);
Następnie użyłem
var blob = new Blob([decodedContent], {type: 'application/octet-stream'});
window.open((window.URL || window.webkitURL).createObjectURL(blob));
Aby skłonić użytkownika, aby zapisać decodedContent
. Kiedy sprawdzam rozmiar zapisanego pliku, mówi on 16892 bajtów, co różni się od podanego powyżej. Każdy pomysł, dlaczego?
Treść to plik tar-ball zakodowany w base64 wysłany z serwera.
for i ,l in enumerate(to_download):
if i == 1:
break
last_index = l.rfind('|')
download_path = l[last_index+1:].strip()
mda_url = '%s/%s'%(root_url, download_path)
logger.debug('Downloading file %s/%s at %s', i, len(to_download), mda_url)
mda_req = urllib2.Request(mda_url)
mda_response = urllib2.urlopen(mda_req)
f = StringIO.StringIO(mda_response.read())
replace_path = mda_url.replace('/', '_')
ti = TarInfo("%s.txt" %replace_path)
ti.size = f.len
tar.addfile(ti, f)
tar.close()
tar_file.close()
with open("/Users/carrier24sg/Desktop/my.tar", 'rb') as f:
tar_str = f.read()
logger.info("Completed downloading all the requested files..")
return tar_str
UPDATE:
zawężony do problemu jest albo var decodedContent = atob(content)
; lub var blob = new Blob([decodedContent], {type: 'application/octet-stream'});
W końcu udało mi się użyć odpowiedzi @Jeremy'ego Banku: here. Jego pierwsza odpowiedź rozwiązuje kwestię różnicy długości treści, ale kiedy sprawdzam sumę kontrolną, zawartość nie wydaje się zgodna. Tylko przy użyciu funkcji drugiej odpowiedzi b64toBlob udało mi się rozwiązać ten problem. Jednak nadal nie jestem pewien, co tu jest nie tak, więc mam nadzieję, że ktoś może rzucić trochę światła na to.
Co pokazuje "blob.size"? – raina77ow
blob.size mówi 16892 – goh
Ok, czy możesz podać przykład tego, co znajduje się w "Dekodowanej treści"? Jednym z wyjaśnień jest to, że 'atob' daje w wyniku łańcuch zawierający znaki wielobajtowe. Na przykład 'var p = atob ('ddd'); var b = new Blob ([p], {type: 'application/octet-stream'}); console.log (b.size);/* 3 */console.log (p.length);/* 2 */' – raina77ow