2012-08-10 13 views
10

का उपयोग करके छवि आकार (बाइट्स) कैसे प्राप्त करें मुझे पता चला कि छवि आयाम प्राप्त करने के लिए पीआईएल का उपयोग कैसे करें, लेकिन फ़ाइल आकार बाइट्स में नहीं है। मुझे फ़ाइल आकार को यह तय करने की आवश्यकता है कि फ़ाइल डेटाबेस पर अपलोड करने के लिए बहुत बड़ी है या नहीं।पीआईएल

+1

क्या आप कोई छवि उत्पन्न कर रहे हैं, या डिस्क पर संग्रहीत छवि है? –

+2

फाइल आकार प्राप्त करने के लिए फाइल सिस्टम एपीआई का उपयोग करें, पीआईएल नहीं। – wberry

+1

या 'लेन() ', यदि आपके पास स्मृति में है और फाइल सिस्टम पर नहीं है (जो संभवत: यदि आप किसी डेटाबेस में बीएलओबी के रूप में संग्रहित हो रहे हैं तो लगता है।) – geoffspear

उत्तर

14

प्रयास करें:

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

अब पीआईएल का उपयोग करने का कोई तरीका है? –

+3

आपको पीआईएल का उपयोग करने की आवश्यकता क्यों होगी? – thebjorn

+0

यह नियंत्रित करने के लिए कि क्या यह छवि एक नकली छवि शीर्षलेख नहीं है, अपलोड प्रोफ़ाइल बनाने के लिए, और उसके बाद इसे डेटाबेस में संग्रहीत करें, इसलिए यह सुनिश्चित करना स्पष्ट है कि आकार को बाइट्स में आकार प्राप्त करने के लिए पीआईएल में कोई विधि बनाना है? –

5

मैं थोड़ा इस के लिए देर हो रही है, लेकिन जब खोज कैसे डिस्क में सहेजे बिना एक जनहित याचिका की छवि का आकार पाने के लिए मैं 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 साथ के रूप में छवि डेटा के पढ़ता है। नोट, हालांकि, यह अधिक रैम का उपयोग करेगा। सब कुछ एक व्यापार है। :-)

संपादित करें: मैं सिर्फ ओपी से इस टिप्पणी को देखा:

अंत में, समस्या अगर किसी को एक तस्वीर है कि 1 गीगा (एक जाली) अपलोड करेंगे, शुरुआत से है वह ' पीआईएल से पहले सर्वर को मार डालेगा, इसकी सामग्री पूरी हो जाएगी, इसलिए इसे समाप्त होने से पहले मुझे अनुरोध को अवरुद्ध करना होगा!

यह एक बहुत ही अलग सवाल है, और शायद वेब सर्वर पर सबसे अच्छा पूरा हो गया है। Nginx के लिए, आप इसे अपनी कॉन्फ़िगरेशन में जोड़ सकते हैं:

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

'बाइट्सियो' विधि डेस्क से आकार प्राप्त करने की तुलना में आकार को कम से कम समझने लगती है। कोई विचार क्यों? – getup8