Установите ограничение размера изображения и измените размер изображения, если это необходимо
Я использую django-ckeditor
для некоторых <textarea>
в моих формах и использовании widget=CKEditorUploadingWidget()
так что я могу загружать изображения, которые работают нормально, но теперь мне нужно установить 1 МБ в качестве ограничения на размер изображений.
Моя первая проблема: как я могу ограничить размер? если возможно, я предпочитаю настроить ограничение в django-ckeditor
конфигурация, это возможно? или я должен сделать это на сервере.
Моя вторая проблема, если изображение больше 1 МБ, мне нужно изменить размер изображения в POST
возможно, уменьшите вес и рост в два раза, и если он будет больше 1 МБ, повторите этот процесс до тех пор, пока размер не станет меньше 1 МБ. Дело в том, что пользователь просто выбирает изображение, а приложение выполняет все, а пользователю не нужно изменить размер изображения самостоятельно.
И моя последняя проблема, если мне нужно сделать весь этот процесс на стороне клиента, что лучше, используйте JQuery
или же Python
с Pillow
и обработать изображение в виде?
Я действительно потерял с этим, любая помощь действительно ценится.
1 ответ
Есть много разговоров, которые могут пойти на это. С другой стороны, есть две проблемы, связанные с проверкой размера изображения. 1) на стороне клиента и 2) на стороне сервера. Итак, давайте разберемся с этим.
Сторона сервера
Это самая важная часть из двух. Да, клиентская сторона может помочь уменьшить размер изображения или сообщить пользователю, что изображение, которое они пытались загрузить, слишком велико, но в конечном итоге вы хотите, чтобы сервер решил, что является приемлемым.
Итак, в Django есть несколько вещей, которые вы можете сделать.
1) ограничить размер файла - в ваших настройках вы можете разместить следующий код
# Add to your settings file
MAX_UPLOAD_SIZE = "1048576"
Создайте средство проверки размера изображения, как показано ниже, и запустите его, чтобы проверить размер поля изображения (имя может измениться). Этот код возвращает ошибку проверки, если '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
это позволит сохранить размер загружаемых файлов от 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 сжимает изображение
# 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
Сторона клиента
На самом деле, клиентская сторона только делает вещи более понятными для пользователя. Вы можете попробовать реализовать этот материал на стороне клиента, но если вы полагаетесь на него, всегда есть вероятность, что кто-то обойдёт настройку на стороне клиента и загрузит "изображение" размером 10 ТБ (некоторые люди просто хотят наблюдать, как мир горит).
1) изменить размер или сжать - То же, что и выше, но с использованием Javascript или Jquery.
2) Обрезка - JCrop - это библиотека, которую я использовал раньше. Требуется некоторая работа, но это полезно. Вы можете помочь пользователю обрезать изображение до более подходящего размера, а также дать ему больше возможностей по сравнению изображения с новым разрешением.
2) полезные сообщения - если изображение, загружаемое пользователем, слишком велико, сообщите ему об этом.
источники
Как получить размер изображения в python-подушке после изменения размера?
Как изменить размер изображения с помощью PIL и сохранить его соотношение сторон?
Как настроить качество изображения с измененным размером в Python Imaging Library?
Изображения также могут быть ограничены в models.py.
Поместите такую функцию в свой файл models.py.
def validate_image(image):
file_size = image.file.size
limit_kb=settings.LIMIT_KB
if file_size > limit_kb * 1024:
raise ValidationError("Max size of file is %s KB" % limit_kb)
Предполагается, что у вас есть:
from django.core.exceptions import ValidationError
Также предполагается, что вы установили константу LIMIT_KB в settings.py.
Затем при добавлении поля включите проверку:
image = models.ImageField(upload_to=image_path,validators=[validate_image])
Размер изображения теперь будет ограничиваться моделью и фиксироваться при использовании формы.