2011-09-29 14 views
5

Ci sono alcuni esempi sul caricamento dei file allo HTML5 Rocks ma c'è qualcosa che non è abbastanza chiaro per me.HTML5 File API - affettare o no?

Per quanto vedo, il codice di esempio su file slicing riceve una parte specifica dal file e la legge. Come dice la nota, questo è utile quando abbiamo a che fare con file di grandi dimensioni.

L'esempio su monitoring uploads rileva inoltre che questo è utile quando stiamo caricando file di grandi dimensioni.

Sono sicuro senza tagliare il file? Intendo problemi sul lato server, memoria, ecc. Chrome non supporta File.slice() attualmente e non voglio usare un plugin jQuery gonfiato se possibile.

risposta

5

Sia Chrome e FF supporto File.slice() ma è stato preceduto, come File.webkitSlice()File.mozSlice() quando its semantics changed qualche tempo fa. C'è un altro esempio di utilizzo di here per leggere parte di un file .zip. Le nuove semantiche sono:

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

Sei sicuro senza tagliarlo? Certo, ma ricorda che stai leggendo il file in memoria. Il tutorial HTML5Rocks offre il chunking del caricamento come un potenziale miglioramento delle prestazioni. Con una logica server decente, puoi anche eseguire operazioni come il recupero da un caricamento fallito più facilmente. L'utente non dovrà ri-provare un intero file 500MB se non è riuscito al 99% :)

+0

E poi c'è Opera, implementato '.slice()' ma in due modi diversi, uno seguendo il w3c e uno che non lo ha fatto =/ –

+2

[MDN dice] (https://developer.mozilla.org/en-US/docs/DOM/Blob), a partire da Firefox 13 e Chrome 21, 'slice()' non è più prefissato. –

+0

È possibile utilizzare il metodo senza prefisso nelle versioni più recenti della maggior parte dei browser. –

0

Questo è il modo di tagliare il file da passare come blob:

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()' è obsoleto. Non è più nella bozza di lavoro [W3C File API] (https://www.w3.org/TR/FileAPI/#dfn-filereader): '// metodi di lettura asincrona' ' void readAsArrayBuffer (Blob blob); ' 'void readAsText (Blob blob, etichetta DOMString opzionale);' 'void readAsDataURL (Blob blob);' –