Существует много разговоров, которые могут пойти на это. С другой стороны, существуют две отдельные проблемы, связанные с проблемой проверки размера изображения. 1) клиентская сторона и 2) сторона сервера. Так что давайте разобьем это.
стороне сервера
Это самая важная часть двух. Да, клиентская сторона может помочь уменьшить размер изображения или сообщить пользователю, что изображение, которое они пытались загрузить, слишком велико, но в конечном итоге вы хотите, чтобы сервер решил, что приемлемо.
Итак, в Django есть несколько вещей, которые вы можете сделать.
1) ограничение на размер файла - В настройках вы можете поместить следующий код
# Add to your settings file
MAX_UPLOAD_SIZE = "1048576"
сделать проверку размера изображения, как в следующем, и запустите его, чтобы проверить размер «image_field» (имя может меняться). Этот код возвращает ошибку проверки, если «image_field» слишком велико.
#Add to a form containing a FileField and change the field names accordingly.
from django.template.defaultfilters import filesizeformat
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
def check_image_field_size(self):
content = self.cleaned_data.get('image_field')
if content._size > settings.MAX_UPLOAD_SIZE:
raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.MAX_UPLOAD_SIZE), filesizeformat(content._size)))
return content
source
это будет держать загруженный размер файла от превышения 1 МБ, периода.
2) изменить размер изображения - Используя PIL (подушка), измените размер изображения.
import StringIO
from PIL import Image
from io import BytesIO
# get the image data from upload
image_field = self.cleaned_data.get('image_field')
image_file = StringIO.StringIO(image_field.read())
image = Image.open(image_file)
# like you said, cut image dimensions in half
w, h = image.size
image = image.resize((w/2, h/2), Image.ANTIALIAS)
# check if the image is small enough
new_img_file = BytesIO()
image.save(new_img_file, 'png')
image_size = new_img_file.tell()
# if the image isn't small enough, repeat the previous until it is.
3) Lossy compresss изображению
# assuming you already have the PIL Image object (im)
quality_val = 90
new_img_file = BytesIO()
im.save(filename, 'JPEG', quality=quality_val)
image_size = new_img_file.tell()
# if image size is too large, keep repeating
Client Side
Действительно, на стороне клиента только делает вещи более простым для пользователя.Вы можете попробовать реализовать этот материал на стороне клиента, но если вы полагаетесь на него, всегда есть возможность кого-то обойти настройку на стороне клиента и загрузить изображение размером 10 ТБ (некоторые люди просто хотят смотреть на мир).
1) изменение размера или сжатие - то же, что и выше, но с использованием Javascript или JQuery.
2) cropping - JCrop - это библиотека, которую я использовал раньше. Это требует некоторой работы, но это полезно. Вы можете помочь пользователю обрезать изображение до более подходящего размера, а также дать им больше возможностей по сравнению с изображением нового разрешения.
2) полезные сообщения. Если изображение, загружаемое пользователем, слишком велико, сообщите им об этом.
Источники
How to get image size in python-pillow after resize?
How do I resize an image using PIL and maintain its aspect ratio?
How to adjust the quality of a resized image in Python Imaging Library?
Большое спасибо за объяснение, действительно полезно. Проверка первой точки 'MAX_UPLOAD_SIZE =" 1048576 "или' MAX_UPLOAD_SIZE = 1048576' не работает. Я все еще могу загрузить большие изображения 1mb. –
Насколько крупнее? –
Я быстро дал этот совет. Позвольте мне внести некоторые изменения. –