2013-04-02 56 views
10

我想上傳圖像控制,如果它是大於最大文件上傳limit.I的大小此嘗試之一:瓶:獲取request.files的大小對象

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

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

它打印0凡我做錯了嗎?我應該從它的臨時路徑中找到這個圖像的大小嗎?是不是有喜歡PHP的$_FILES['foo']['size']在Python什麼?

回答

17

有幾件事情要注意在這裏 - 在CONTENT_LENGTH屬性將文件上傳的內容長度瀏覽器上報,但遺憾的是很多瀏覽器不發送此,作爲docssource指出。

至於你的TypeError,接下來要注意的是,在500KB以下的文件上傳被作爲StringIO object存儲在內存中,而不是假脫機到磁盤(再次看到這些文檔),所以你的統計調用將失敗。

MAX_CONTENT_LENGTH是拒絕大於你想要的文件上傳的正確方法,如果你需要它,確定數據長度的唯一可靠方法是在你處理上傳之後找出它 - stat該文件後,你已經.save() d它:

request.files['file'].save('/tmp/foo') 
size = os.stat('/tmp/foo').st_size 

或者,如果你不使用的磁盤(例如,它存儲在數據庫中),算你讀過字節:

blob = request.files['file'].read() 
size = len(blob) 

雖然顯然要小心,你不會讀太多d ATA到內存中,如果你的MAX_CONTENT_LENGTH是非常大的

+0

好的,謝謝你的回答 – saidozcan

+1

是不是http://stackoverflow.com/a/23601025/125507更好?只是尋求文件的結尾,你沒有使用任何內存? – endolith

8

正確的方法來設置一個最大的文件上傳限制是通過MAX_CONTENT_LENGTH應用配置。例如,如果你想設置的16兆字節的上傳限制,你會做以下,以您的應用程序配置:

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

如果上傳的文件太大,瓶將自動返回狀態碼413請求實體過大 - 這應該在客戶端處理。

+1

好吧,這是一個好辦法。仍然沒有辦法獲得圖像大小? – saidozcan

+0

這很好,除非你的系統在一個小驅動器上,並且你希望用戶上傳任何文件大小,除非它超過了可用空間。在這種情況下,使用文件。seek()建議由Steely Wing – andrei

1

正如別人已經建議,你應該使用

app.config['MAX_CONTENT_LENGTH'] 

限制文件大小。但是 既然你特別希望找出圖像的大小,你可以這樣做:

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

現在它說TypeError:強制爲Unicode:需要字符串或緩衝區,找到FileStorage。我該怎麼辦? – saidozcan

+0

'request.files'不包含路徑。 – ThiefMaster

10

如果你不想

import os 

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

否則將文件保存到磁盤首先,使用下面的代碼,這項工作在內存中的數據流,這樣會更好

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

'file.seek(0,2)'應該在不導入'os'的情況下做同樣的事情? http://stackoverflow.com/a/283719/125507尋求從文件末尾0字節 – endolith

2

代碼應該符合你的目的,下面一段..

 

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