2011-09-29 15 views
5

Hay algunos buenos ejemplos sobre la carga de archivos en HTML5 Rocks, pero hay algo que no es lo suficientemente claro para mí.HTML5 File API: ¿dividir o no?

Por lo que veo, el código de ejemplo sobre file slicing es obtener una parte específica del archivo luego de leerlo. Como dice la nota, esto es útil cuando se trata de archivos grandes.

El ejemplo sobre monitoring uploads también indica que esto es útil cuando estamos cargando archivos de gran tamaño.

¿Estoy seguro sin cortar el archivo? Quiero decir problemas del lado del servidor, memoria, etc. Chrome no es compatible con File.slice() actualmente y no quiero usar un plugin jQuery inflado si es posible.

Respuesta

5

Tanto Chrome y FF apoyo File.slice() pero se ha prefijado como File.webkitSlice()File.mozSlice() cuando hace algún tiempo its semantics changed. Hay otro ejemplo de usarlo here para leer parte de un archivo .zip. La nueva semántica es:

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

¿Estás seguro sin cortarlo? Claro, pero recuerda que estás leyendo el archivo en la memoria. El tutorial de HTML5Rocks ofrece dividir la carga como una posible mejora del rendimiento. Con una lógica de servidor decente, también podría hacer cosas más fáciles, como recuperarse de una carga fallida. El usuario no tendría que volver a probar todo un archivo de 500 MB si falló en el 99% :)

+0

Y luego está la Opera, implementó '.slice()' pero de dos maneras diferentes, una siguiendo a la w3c y otra que no lo hizo =/ –

+2

[dice MDN] (https://developer.mozilla.org/en-US/docs/DOM/Blob) que, a partir de Firefox 13 y Chrome 21, 'slice()' ya no está prefijado. –

+0

Puede usar el método sin prefijo en las versiones más recientes de la mayoría de los navegadores. –

0

Ésta es la manera de cortar el archivo para pasar como manchas:

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()' está en desuso. Ya no está en la [W3C File API] (https://www.w3.org/TR/FileAPI/#dfn-filereader) borrador en funcionamiento: '// métodos de lectura asíncronos' ' void readAsArrayBuffer (Blob blob); ' 'void readAsText (Blob blob, etiqueta DOMString opcional);' 'void readAsDataURL (Blob blob);' –