2014-12-19 16 views
6

Ho una stringa base64 che ho decodificato e desidera consentire all'utente di salvarlo come un file. In particolare, quando controllo la lunghezza di decodedContent, sono 11271 byte.javascript: dimensione del file scaricato diversa dalla lunghezza del contenuto

var content = messageObj['data']; 
var decodedContent = atob(content); 
console.log(decodedContent.length); 

Poi ho usato

var blob = new Blob([decodedContent], {type: 'application/octet-stream'}); 
window.open((window.URL || window.webkitURL).createObjectURL(blob)); 

Per richiedere all'utente di salvare decodedContent. Quando controllo le dimensioni del file salvate, dice 16892 byte, che è diverso da quanto affermato sopra. Qualche idea del perché?

Il contenuto è un file tar-ball codificato in base64 inviato dal server.

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:

ristretto al problema essere sia con var decodedContent = atob(content); oppure var blob = new Blob([decodedContent], {type: 'application/octet-stream'});

Finalmente sono riuscito a utilizzare la risposta di @Jeremy Bank here. La sua prima risposta risolve il problema della lunghezza del contenuto che è diversa, ma quando controllo il checksum, il contenuto non sembra corrispondere. Ho solo risolto la funzione della seconda risposta b64toBlob. Tuttavia, non sono ancora sicuro di cosa c'è che non va, quindi spero che qualcuno possa far luce su questo.

+0

Cosa mostra "blob.size'? – raina77ow

+0

blob.size dice 16892 – goh

+0

Ok, puoi dare un esempio di cosa c'è in 'decodedContent'? Una spiegazione è che 'atob' restituisce una stringa che contiene caratteri multibyte. Ad esempio, 'var p = atob ('ddd'); var b = new Blob ([p], {type: 'application/octet-stream'}); console.log (B.Size);/* 3 */console.log (p.length);/* 2 */' – raina77ow

risposta

0

Penso che il problema sia che atomb() restituisce una versione base64 del file. quando chiedete la dimensione di esso, restituirà i byte che contiene.

Quando si crea un blob dalla variabile base64 e si chiede la sua dimensione, verrà restituito lo spazio che verrà riempito sul computer.

Le due cose sono diverse perché la dimensione di memorizzazione dei file e le dimensioni codificate non sono la stessa cosa. E si differenziano anche su piattaforme diverse.

Problemi correlati