2012-08-10 35 views
10

我發現如何使用PIL來獲取圖像尺寸,但不是以字節爲單位的文件大小。我需要知道文件大小以決定文件是否太大而無法上傳到數據庫。如何使用PIL獲取圖像大小(字節)

+1

您是生成圖像還是存儲在磁盤上的圖像? – 2012-08-10 14:50:06

+2

使用文件系統API來獲取文件大小,而不是PIL。 – wberry 2012-08-10 14:51:42

+1

或'len()',如果你在內存中而不是在文件系統上(這看起來很可能是你將數據庫存儲爲BLOB)。 – geoffspear 2012-08-10 14:52:49

回答

14

嘗試:

import os 
print os.stat('somefile.ext').st_size 
+0

現在有使用PIL本身的方法嗎? – 2012-08-10 14:56:38

+3

爲什麼你需要使用PIL? – thebjorn 2012-08-10 15:00:59

+0

來控制它是否是一個圖像不是僞造的圖像標題,做一個上傳profil,然後將其存儲到數據庫,所以很明顯,使PIL中的方法獲得以字節爲單位的大小不是? – 2012-08-10 15:04:15

5

我有點晚,但我搜索如何獲得PIL圖像的大小,而不把它保存到磁盤時碰到這個問題,5分鐘前來到。萬一別人遇到這個,這是做一個簡單的方法:

import StringIO 
output = StringIO.StringIO() 
image_output.save(output, 'PNG') #a format needs to be provided 
contents = output.getvalue() 
output.close() 

image_filesize = len(contents) 
5

如果你已經在文件系統中的圖像:

import os 
os.path.getsize('path_to_file.jpg')` 

但是,如果你想要得到的即在存儲器中並且還沒有被保存到文件系統的圖像的保存尺寸:所述圖像數據的

from io import BytesIO 
img_file = BytesIO() 
image.save(img_file, 'png') 
image_file_size = img_file.tell() 

該方法將避免多次讀取,用StringIO。但請注意,它將使用更多的RAM。一切都是權衡。 :-)

編輯:我剛纔看到從OP此評論:

最後,問題是從beginnig,如果有人上傳圖片 有1個千兆(僞造的),他」在PIL 會做它的東西之前會殺死服務器,所以我必須在它完成之前阻止請求!

這是一個非常不同的問題,可能是最好的完成在網絡服務器。對於nginx,您可以將其添加到您的配置中:

http { 
    #... 
     client_max_body_size 100m; # or whatever size you want as your limit 
    #... 
} 
+0

與從桌面獲取尺寸相比,「BytesIO」方法似乎低估了尺寸。任何想法爲什麼? – getup8 2017-01-12 22:53:22