Ich habe eine Base64-Zeichenfolge, die ich entschlüsselt habe und möchte dem Benutzer ermöglichen, dies als eine Datei zu speichern. Insbesondere wenn ich die Länge von decodedContent überprüfe, ist es 11271 Bytes.Javascript: heruntergeladene Dateigröße unterscheidet sich von der Länge des Inhalts
var content = messageObj['data'];
var decodedContent = atob(content);
console.log(decodedContent.length);
Dann habe ich
var blob = new Blob([decodedContent], {type: 'application/octet-stream'});
window.open((window.URL || window.webkitURL).createObjectURL(blob));
den Benutzer aufzufordern, decodedContent
zu speichern. Wenn ich die Dateigröße überprüfe, sagt es 16892 Bytes, was sich von dem oben genannten unterscheidet. Irgendeine Idee warum?
Der Inhalt ist eine Base64-kodierte Tar-Ball-Datei, die vom Server gesendet wird.
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:
verengte bis auf das Problem mit entweder var sein decodedContent = atob(content)
; oder var blob = new Blob([decodedContent], {type: 'application/octet-stream'});
Endlich gelang es mir, die @ Jeremy Bank Antwort here zu verwenden. Seine erste Antwort löst das Problem, dass die Inhaltslänge unterschiedlich ist, aber wenn ich die Prüfsumme überprüfe, scheint der Inhalt nicht zu stimmen. Nur mit der Funktion b64toBlob seiner zweiten Antwort konnte ich das lösen. Ich bin mir aber immer noch nicht sicher, was hier falsch ist, also hoffe ich, dass jemand etwas Licht ins Dunkel bringen kann.
Was zeigt 'blob.size'? – raina77ow
blob.size sagt 16892 – goh
Ok, kannst du ein Beispiel dafür geben, was in 'decodedContent' steckt? Eine Erklärung ist, dass "atob" zu einer Zeichenfolge führt, die Multibyte-Zeichen enthält. Zum Beispiel: var p = atob ('ddd'); var b = neuer Blob ([p], {Typ: 'application/octet-stream'}); console.log (b.größe);/* 3 */console.log (p.length);/* 2 */' – raina77ow