2016-04-26 1 views
0

Я использую django-ckeditor для некоторых <textarea> в своих формах и использую widget=CKEditorUploadingWidget(), поэтому я могу загружать изображения, которые отлично работают, но теперь мне нужно установить ограничение на 1 мб для изображений.Установите ограничение по размеру изображения и измените размер изображения, если это необходимо

Моя первая проблема: Как я могу ограничить размер? если возможно, я предпочитаю настроить предел в конфигурации django-ckeditor, это возможно? или я должен сделать это на сервере.

Моя вторая проблема в том, если изображение больше размера 1mb. Мне нужно изменить размер изображения в POST, возможно, уменьшите вес и высоту на половину, и если еще больше 1 мб повторить этот процесс, пока размер не будет меньше 1 мб, Дело в том, что пользователь просто выбирает изображение, а приложение выполняет все необходимые действия, и пользователь не должен изменять его изображение самостоятельно.

И моя последняя проблема, если мне нужно сделать весь этот proccess на стороне клиента, что лучше использовать JQuery или Python с Pillow и proccess изображения в представлении?

Я действительно проиграл с этим, любая помощь действительно оценена.

ответ

2

Существует много разговоров, которые могут пойти на это. С другой стороны, существуют две отдельные проблемы, связанные с проблемой проверки размера изображения. 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?

+0

Большое спасибо за объяснение, действительно полезно. Проверка первой точки 'MAX_UPLOAD_SIZE =" 1048576 "или' MAX_UPLOAD_SIZE = 1048576' не работает. Я все еще могу загрузить большие изображения 1mb. –

+0

Насколько крупнее? –

+0

Я быстро дал этот совет. Позвольте мне внести некоторые изменения. –

Смежные вопросы