2013-04-02 34 views
10

tôi muốn có được kích thước của hình ảnh tải lên để kiểm soát nếu nó lớn hơn tập tin tối đa tải lên limit.I thử này một:Flask: Lấy kích thước của đối tượng request.files

@app.route("/new/photo",methods=["POST"]) 
def newPhoto(): 

    form_photo = request.files['post-photo'] 
    print form_photo.content_length 

Nó in 0 đâu tôi đang làm sai à? Tôi có nên tìm kích thước của hình ảnh này từ con đường tạm thời của nó không? Không có bất cứ điều gì như PHP $_FILES['foo']['size'] trong Python?

Trả lời

17

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ố docssource.

Đố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

+0

Ok, cảm ơn câu trả lời của bạn – saidozcan

+1

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

8

Cách thích hợp để đặt giới hạn tải lên tệp tối đa là thông qua cấu hình ứng dụng MAX_CONTENT_LENGTH. Ví dụ, nếu bạn muốn thiết lập một giới hạn tải lên là 16 megabyte, bạn sẽ làm như sau để cấu hình ứng dụng của bạn:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 

Nếu tập tin được tải lên quá lớn, Flask sẽ tự động trở mã trạng thái 413 Request Entity Too Lớn - điều này sẽ được xử lý ở phía khách hàng.

+1

được rồi, đây là một cách tốt. Vẫn không có cách nào để có được kích thước hình ảnh? – saidozcan

+0

điều này là tốt trừ khi hệ thống của bạn ở trên một ổ đĩa nhỏ và bạn muốn người dùng tải lên bất kỳ kích thước tệp nào trừ khi nó vượt quá dung lượng trống. trong trường hợp này, hãy sử dụng tệp.seek() được đề xuất bởi Steely Wing – andrei

1

Khi ai đó đã đề nghị, bạn nên sử dụng

app.config['MAX_CONTENT_LENGTH'] 

để hạn chế kích thước tập tin. Nhưng Vì bạn đặc biệt muốn tìm hiểu kích thước hình ảnh, bạn có thể làm:

import os 
photo_size = os.stat(request.files['post-photo']).st_size 
print photo_size 
+3

Bây giờ nó nói TypeError: liên kết với Unicode: cần chuỗi hoặc bộ đệm, FileStorage tìm thấy. Tôi nên làm gì? – saidozcan

+0

'request.files' không chứa đường dẫn. – ThiefMaster

10

Nếu bạn không muốn lưu các tập tin vào đĩa đầu tiên, sử dụng đoạn mã sau, tác phẩm này vào hoạt động trong bộ nhớ

import os 

file = request.files['file'] 
file.seek(0, os.SEEK_END) 
file_length = file.tell() 

khác, điều này sẽ tốt hơn

request.files['file'].save('/tmp/file') 
file_length = os.stat('/tmp/file').st_size 
+0

'file.seek (0, 2)' nên làm điều tương tự mà không cần nhập 'os'? http://stackoverflow.com/a/283719/125507 tìm cách 0 byte từ cuối tệp – endolith

2

phần sau của mã phải đáp ứng mục đích của bạn ..

 

form_photo.seek(0,2) 
size = form_photo.tell() 

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