我在表单中使用django-ckeditor
表示某些<textarea>
并使用widget=CKEditorUploadingWidget()
,因此我可以上传图片,但工作正常,但现在我需要设置1mb作为大小限制图像。
我的第一个问题是如何限制大小?如果可行则我更喜欢在django-ckeditor
配置中配置限制,这是否可行?或者我必须在服务器上执行此操作。
我的第二个问题是如果图像大于1mb我需要调整POST
中的图像大小,可能会减轻一半的重量和高度,如果仍然更大的1mb重复该过程直到大小更小1mb,重点是用户只需选择图像,应用程序就可以完成所有操作,用户不必自己调整图像大小。
我的最后一个问题是,如果我需要在客户端执行所有这些过程,那么更好的是,使用JQuery
或Python
与Pillow
并在视图中处理图像?
我真的迷失了这一点,任何帮助都是非常准确的。
答案 0 :(得分:3)
有很多可以讨论的话题。另一方面,基本上有两个单独的问题需要担心图像尺寸检查。 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
这样可以保持上传的文件大小不超过1MB。
2)调整图像大小 - 使用PIL(Pillow),调整图像大小。
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)有损压缩图像
# 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
实际上,客户端只会让用户更直接。你可以尝试在客户端实现这些东西,但如果你依赖它,总有可能有人绕过你的客户端设置并上传一个10TB大小的“图像”(有些人只想看世界燃烧)。
1)调整大小或压缩 - 与上面相同,但使用Javascript或Jquery。
2)裁剪 - 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?
答案 1 :(得分:1)
图像也可以在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
它还假设您在settings.py中设置了恒定LIMIT_KB。
然后在添加字段时包括验证:
image = models.ImageField(upload_to=image_path,validators=[validate_image])
现在图像尺寸将受到模型的限制,并且在使用表格时会被捕获。