2014-12-19 12 views
6

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.

+0

Co pokazuje "blob.size"? – raina77ow

+0

blob.size mówi 16892 – goh

+0

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

Odpowiedz

0

Myślę, że problem polega na tym, że atomb() zwraca podstawową wersję pliku base64. kiedy poprosisz o jego rozmiar, zwróci on bajty, które zawiera.

Kiedy robisz kropelkę ze zmiennej base64 i pytasz o jej rozmiar, zwróci ona ile miejsca zapełni się na twoim komputerze.

Dwie rzeczy są różne, ponieważ rozmiar przechowywania pliku i zakodowany rozmiar nie są tym samym. Różnią się także na różnych platformach.

Powiązane problemy