Я узнал, как использовать PIL для получения размеров изображения, но не размер файла в байтах. Мне нужно знать размер файла, чтобы решить, слишком ли большой файл для загрузки в базу данных.
Как получить размер изображения (байты) с помощью PIL
Ответ 1
Try:
import os
print os.stat('somefile.ext').st_size
Ответ 2
Я немного опаздываю на это, но я столкнулся с этим вопросом 5 минут назад, когда искал, как получить размер изображения PIL, не сохраняя его на диск. В случае, если кто-то еще сталкивается с этим, это простой способ сделать это:
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)
Ответ 3
Если у вас уже есть изображение в файловой системе:
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. Обратите внимание, однако, что он будет использовать больше ОЗУ. Все это компромисс.: -)
Изменить: я только что увидел этот комментарий из OP:
наконец, проблема начинается с начала, если кто-то выгрузит картинка, имеющая 1 гига (кованая), он убьет сервер до PIL будет делать свои вещи, поэтому я должен заблокировать запрос до его завершения!
Это очень другой вопрос и, вероятно, лучше всего выполняется на веб-сервере. Для nginx вы можете добавить это в свою конфигурацию:
http {
#...
client_max_body_size 100m; # or whatever size you want as your limit
#...
}