2011-09-29 21 views
5

關於文件上傳HTML5 Rocks有一些很好的例子,但有些東西對我來說還不夠清楚。HTML5文件API - 切片或不?

就我所見,關於file slicing的示例代碼是從文件中獲取特定部分然後讀取它。正如說明所述,這對我們處理大文件時很有幫助。

有關monitoring uploads的示例還指出,當我們上傳大文件時,這非常有用。

我沒有切片文件安全嗎?我的意思是服務器端問題,內存等。Chrome目前不支持File.slice(),如果可能的話,我不想使用臃腫的jQuery插件。

回答

5

Chrome和FF都支持File.slice(),但前段時間its semantics changed前綴爲File.webkitSlice()File.mozSlice()。還有另外一個使用它來讀取.zip文件的一部分的例子。新的語義是:

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

你安全沒有切片嗎?當然,但請記住你正在將文件讀入內存。 HTML5Rocks教程提供了分塊上傳功能,作爲潛在的性能改進。藉助一些體面的服務器邏輯,您還可以更輕鬆地從失敗的上傳中恢復。用戶將不必重新嘗試整個500MB的文件,如果它失敗在99%:)

+0

然後還有歌劇,實現'.slice()',但有兩種不同的方式,一種遵循w3c,另一種不是=/ –

+2

[MDN說](https://developer.mozilla.org/en-US/docs/DOM/Blob ),從Firefox 13和Chrome 21開始,slice()不再是前綴。 –

+0

您可以在大多數瀏覽器的新版本中使用不帶前綴的方法。 –

0

這是切片文件的方式來傳遞的斑點:

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()'已棄用。它不再位於[W3C File API](https://www.w3.org/TR/FileAPI/#dfn-filereader)工作草案:'// async read methods' 'void readAsArrayBuffer(Blob blob);' 'void readAsText(Blob blob,可選的DOMString標籤);' 'void readAsDataURL(Blob blob);' –