2014-12-19 11 views
6

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.

+0

Was zeigt 'blob.size'? – raina77ow

+0

blob.size sagt 16892 – goh

+0

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

Antwort

0

Ich denke, das Problem ist, dass atomb() gibt eine grundlegende base64-Version der Datei zurück. Wenn Sie nach der Größe fragen, gibt es die enthaltenen Bytes zurück.

Wenn Sie einen Blob aus der base64-Variablen erstellen und nach seiner Größe fragen, gibt er zurück, wie viel Platz er auf Ihrem Computer einnehmen wird.

Die zwei Dinge sind unterschiedlich, weil Dateispeichergröße und codierte Größe nicht dasselbe sind. Und sie unterscheiden sich auch auf verschiedenen Plattformen.

Verwandte Themen