Có một vài điều cần phải nhận thức được đây - tài sản CONTENT_LENGTH sẽ là chiều dài nội dung của tập tin tải lên như được trình duyệt báo cáo, nhưng rất tiếc là nhiều trình duyệt không gửi điều này, như được ghi chú trong các số docs và source.
Đối với TypeError của bạn, điều tiếp theo cần lưu ý là tệp tải lên dưới 500KB được lưu trữ trong bộ nhớ dưới dạng StringIO object, chứ không phải là đĩa đệm (xem lại tài liệu), vì vậy lệnh gọi stat của bạn sẽ không thành công.
MAX_CONTENT_LENGTH là cách chính xác để từ chối tải lên tệp lớn hơn bạn muốn và nếu bạn cần, cách đáng tin cậy nhất để xác định độ dài của dữ liệu là tìm ra sau khi bạn đã xử lý tải lên các tập tin sau khi bạn đã .save()
d nó:
request.files['file'].save('/tmp/foo')
size = os.stat('/tmp/foo').st_size
Hoặc nếu bạn không sử dụng đĩa (ví dụ lưu trữ nó trong một cơ sở dữ liệu), đếm byte bạn đã đọc:
blob = request.files['file'].read()
size = len(blob)
Mặc dù rõ ràng là cẩn thận bạn không đọc quá nhiều d ata vào bộ nhớ nếu MAX_CONTENT_LENGTH của bạn là rất lớn
Ok, cảm ơn câu trả lời của bạn – saidozcan
không phải là http://stackoverflow.com/a/23601025/125507 tốt hơn? chỉ cần tìm đến cuối tập tin và bạn không sử dụng bất kỳ bộ nhớ nào? – endolith