2011-09-29 43 views
5

Có một số ví dụ hay về tải lên tệp tại HTML5 Rocks nhưng có điều gì đó không đủ rõ ràng đối với tôi.API tệp HTML5 - có cắt hay không?

Theo tôi thấy, mã ví dụ về file slicing là lấy một phần cụ thể từ tệp rồi đọc. Như lưu ý nói, điều này rất hữu ích khi chúng ta đang xử lý các tệp lớn.

Ví dụ về monitoring uploads cũng lưu ý rằng điều này hữu ích khi chúng tôi tải lên các tệp lớn.

Tôi có an toàn khi không cắt tệp không? Tôi có nghĩa là vấn đề phía máy chủ, bộ nhớ, v.v. Chrome hiện không hỗ trợ File.slice() và tôi không muốn sử dụng plugin jQuery cồng kềnh nếu có thể.

Trả lời

5

Cả hỗ trợ Chrome và FF File.slice() nhưng đã được đặt trước là File.webkitSlice()File.mozSlice() khi its semantics changed một số thời gian trước đây. Có một ví dụ khác về việc sử dụng nó here để đọc một phần của tệp .zip. Các ngữ nghĩa mới là:

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

Bạn có an toàn mà không cần cắt không? Chắc chắn, nhưng hãy nhớ rằng bạn đang đọc tệp vào bộ nhớ. Hướng dẫn HTML5Rocks cung cấp đoạn tải lên như một cải tiến hiệu suất tiềm năng. Với một số logic máy chủ phong nha, bạn cũng có thể làm những việc như khôi phục từ tải lên không thành công dễ dàng hơn. Người dùng sẽ không cần phải thử lại toàn bộ một file 500MB nếu nó không thành công tại 99% :)

+0

Và sau đó có Opera, đã thực hiện '.slice()' nhưng theo hai cách khác nhau, một theo sau w3c và một không =/ –

+2

[MDN nói] (https://developer.mozilla.org/en-US/docs/DOM/Blob), như của Firefox 13 và Chrome 21, 'slice()' không còn được thêm tiền tố nữa. –

+0

Bạn có thể sử dụng phương thức không có tiền tố trong các phiên bản mới hơn của hầu hết các trình duyệt. –

0

Đây là cách để cắt các tập tin để vượt qua như blobs:

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()' không được chấp nhận. Nó không còn trong [File API W3C] (https://www.w3.org/TR/FileAPI/#dfn-filereader) bản thảo làm việc: '// async read methods' ' void readAsArrayBuffer (Blob blob); ' 'void readAsText (Blob blob, nhãn DOMString tùy chọn);' 'void readAsDataURL (Blob blob);' –

Các vấn đề liên quan