2011-09-29 9 views
5

Istnieje kilka ładnych przykładów przesyłania plików pod numerem HTML5 Rocks, ale jest coś, co nie jest dla mnie wystarczająco jasne.Interfejs API HTML5 - krojenie czy nie?

O ile widzę, przykładowy kod o numerze file slicing pobiera konkretną część z pliku, a następnie ją odczytuje. Jak napisano w notatce, jest to przydatne, gdy mamy do czynienia z dużymi plikami.

Również przykład dotyczący monitoring uploads również jest przydatny, gdy przesyłamy duże pliki.

Czy mogę bezpiecznie bez krojenia pliku? Mam na myśli problemy po stronie serwera, pamięć itp. Chrome nie obsługuje obecnie File.slice() i nie chcę używać rozszerzonej wtyczki jQuery, jeśli to możliwe.

Odpowiedz

5

Zarówno Chrome i FF wsparcie File.slice() ale została ona poprzedzona jak File.webkitSlice()File.mozSlice() gdy its semantics changed jakiś czas temu. Istnieje inny przykład użycia go do odczytu części pliku .zip. Nowa semantyka to:

Blob.webkitSlice( 
    in long long start, 
    in long long end, 
    in DOMString contentType 
); 

Czy jesteś bezpieczny bez krojenia? Jasne, ale pamiętaj, że czytasz plik w pamięci. Samouczek HTML5Rocks oferuje fragmentowanie przesłania jako potencjalną poprawę wydajności. Przy odrobinie logiki serwera możesz również łatwiej odzyskiwać dane po nieudanym przesyłaniu. Użytkownik nie będzie musiał ponownie spróbować całego pliku 500MB, jeśli nie na 99% :)

+0

A jeszcze Opera, zaimplementowano '.slice()' ale na dwa różne sposoby: jeden następujący po w3c i taki, który nie =/ –

+2

[MDN mówi] (https://developer.mozilla.org/en-US/docs/DOM/Blob), że od Firefoksa 13 i Chrome 21, 'slice()' nie jest już dodawany. –

+0

Możesz użyć metody bez prefiksu w nowszych wersjach większości przeglądarek. –

0

jest to sposób na dzielenie pliku przekazać jak bąble:

function readBlob() { 
    var files = document.getElementById('files').files; 
    var file = files[0]; 
    var ONEMEGABYTE = 1048576; 
    var start = 0; 
    var stop = ONEMEGABYTE; 

    var remainder = file.size % ONEMEGABYTE; 
    var blkcount = Math.floor(file.size/ONEMEGABYTE); 
    if (remainder != 0) blkcount = blkcount + 1; 

    for (var i = 0; i < blkcount; i++) { 

     var reader = new FileReader(); 
     if (i == (blkcount - 1) && remainder != 0) { 
      stop = start + remainder; 
     } 
     if (i == blkcount) { 
      stop = start; 
     } 

     //Slicing the file 
     var blob = file.webkitSlice(start, stop); 
     reader.readAsBinaryString(blob); 
     start = stop; 
     stop = stop + ONEMEGABYTE; 

    } //End of loop 

} //End of readblob 
+0

'FileReader.readAsBinaryString()' jest przestarzałe. Nie ma go już w pliku roboczym roboczym [W3C File API] (https://www.w3.org/TR/FileAPI/#dfn-filereader): '// metody odczytu asynchronicznego' ' void readAsArrayBuffer (Blob blob); ' 'void readAsText (Blob blob, opcjonalna etykieta DOMString);' 'void readAsDataURL (Blob blob);' –