2012-05-10 35 views
5

Có hai cách để sử dụng Thư viện tải tệp Apache.Xác định kích thước của tệp tải lên trước khi đọc tất cả trong API tải lên tệp tải lên Apache

FileUpload

http://commons.apache.org/fileupload/using.html

Và Truyền FileUpload API

http://commons.apache.org/fileupload/streaming.html

Cả hai đều làm việc rất tốt ngoại trừ việc streaming API dường như không có một cách để kiểm tra FILESIZE trước khi xử lý suối.

Điều này có phải vì API phát trực tiếp không biết kích thước tệp hay vì tôi cần đọc thủ công một số tiêu đề hoặc thứ gì đó để tải kích thước tải lên nhiều phần?

Trả lời

14

Không có cách nào để biết kích thước của một phần của yêu cầu nhiều phần mà không tiêu thụ toàn bộ thân yêu cầu HTTP. Và một khi tiêu thụ cơ thể yêu cầu HTTP đã bắt đầu, bạn không thể ngừng tiêu thụ nó nửa chừng. Nó phải được tiêu thụ cho đến byte cuối cùng trước khi một phản hồi có thể được trả về. Đó chỉ là bản chất của HTTP và TCP/IP. Để giữ mức sử dụng bộ nhớ máy chủ thấp, bạn có thể loại bỏ các byte đọc khi chúng vượt quá kích thước (ví dụ: kiểm tra nó bên trong vòng lặp đọc và không gán chúng cho bất kỳ biến nào).

Đặt cược tốt nhất của bạn là xác thực độ dài tệp trong JavaScript trước khi quá trình tải lên diễn ra. Điều này được hỗ trợ trong các trình duyệt supporting HTML5 File API. Các phiên bản hiện tại của Firefox, Chrome, Safari, Opera và Android hỗ trợ nó. IE9 không hỗ trợ nó, nó sẽ có trong IE10 trong tương lai.

<input type="file" ... onchange="checkFileSize(this)" /> 

Trường hợp checkFileSize() nhìn một cái gì đó như thế này

function checkFileSize(inputFile) { 
    var max = 10 * 1024 * 1024; // 10MB 

    if (inputFile.files && inputFile.files[0].size > max) { 
     alert("File too large."); // Do your thing to handle the error. 
     inputFile.value = null; // Clear the field. 
    } 
} 
+0

Với sự tôn trọng để Balus ... ở phía máy chủ, kể từ khi OP được hỏi về điều đó và không phải trên client side (JS). .. đây không phải là cách tốt để kiểm tra. Tiêu đề "Content-Length" được đặt bởi ứng dụng khách và không thể hoặc không đáng tin cậy. Ở phía máy chủ, sử dụng API trực tuyến cộng với "Độ dài nội dung" từ tiêu đề, người dùng có thể xác định tệp lớn nhất có thể "" dựa trên: ContentLength (sum) - byte tiêu đề đọc cho đến khi bắt đầu tệp đạt được trong yêu cầu nhiều phần. Sử dụng API truyền trực tuyến, đọc khối và tổng hợp để bảo vệ chống lại quá tải lên quá lớn. –

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