如何设置最大图像大小以在 django-ckeditor 中上传图像?

Posted

技术标签:

【中文标题】如何设置最大图像大小以在 django-ckeditor 中上传图像?【英文标题】:How to set the maximum image size to upload image in django-ckeditor? 【发布时间】:2020-11-18 00:21:51 【问题描述】:

我正在为我的项目使用 django-ckeditor 来上传图片和文本内容。 我用了 body = RichTextUploadingField(blank=True, null=True) 在模型中。 现在我想限制用户上传内容中的大尺寸图像或大于预定义的最大高度/宽度。我希望上传的图片内容具有特定的高度/重量和大小,例如小于 1mb。

如何预定义最大图片高度和宽度以及最大图片尺寸限制?

有没有办法从 django-ckeditor 配置中定义它?

或者如何在用户提交表单后从后端的内容中调整上传的图片大小?

这是我的models.py:

class Post(models.Model):
    STATUS_CHOICES = 
      ('draft', 'Draft'),
      ('published', 'Published'),
    
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = RichTextUploadingField(blank=True, null=True)
    status = models.CharField(max_length=10,
                             choices=STATUS_CHOICES,
                             default='draft')

我尝试了很多来解决它但失败了。有解决这个问题的建议吗? 提前致谢。

【问题讨论】:

【参考方案1】:

我认为应该有一种方法可以在上传时调整图片大小。但老实说,我没有通过调试找到,也没有在文档中找到。

但是,我可以建议您一个解决方法,以便在保存 Post 模型后对内容中的所有图像进行后处理。

models.py

from django.conf import settings
from PIL import Image

def resize_image(filename):
    """
    here goes resize logic.
    For example, I've put 50% of current size if width>=900.
    Might be something more sophisticated
    """
    im = Image.open(filename)
    width, height = im.size
    if width >= 500:
        im = im.resize((int(width * 0.5), int(height * 0.5)))
        im.save(filename)

class Post(models.Model):
    ...
    body = RichTextUploadingField(blank=True, null=True)
    ...

    def save(self, *args, **kwargs):
        for token in self.body.split():
            # find all <img src="/media/.../img.jpg">
            if token.startswith('src='):
                filepath = token.split('=')[1].strip('"')   # get path of src
                filepath = filepath.replace('/media', settings.MEDIA_ROOT)  # resolve path to MEDIA_ROOT
                resize_image(filepath)  #do resize in-place

        super().save(*args, **kwargs)

该解决方案不是很好,因为它仅在上传后调整图片大小。

可能库本身在上传时应该有某种退出点/回调用于图像预处理。

【讨论】:

【参考方案2】:

您可以在setting.py中设置CKEDITOR_THUMBNAIL_SIZE

CKEDITOR_THUMBNAIL_SIZE = (500, 500)

使用pillow 后端,您可以使用CKEDITOR_THUMBNAIL_SIZE 设置(以前的THUMBNAIL_SIZE)更改缩略图大小。默认值:(75, 75)

使用pillow后端,您可以将上传的图像转换并压缩为jpeg,以节省磁盘空间。将CKEDITOR_FORCE_JPEG_COMPRESSION 设置为True(默认False)您可以更改CKEDITOR_IMAGE_QUALITY 设置(以前为IMAGE_QUALITY),它被传递给Pillow

图像质量,范围从 1(最差)到 95(最好)。默认 是 75。应避免高于 95 的值; 100 禁用部分 JPEG 压缩算法,导致大文件几乎没有 提高图像质量。

动画图像禁用此功能。

查看官方文档。 https://github.com/django-ckeditor/django-ckeditor/blob/master/README.rst

【讨论】:

以上是关于如何设置最大图像大小以在 django-ckeditor 中上传图像?的主要内容,如果未能解决你的问题,请参考以下文章

CSS图像最大宽度设置为原始图像大小?

如何使用 Cloudfront 设置 AWS Elastic Beanstalk 以在 PHP 堆栈上托管图像和视频

从图库中获取图像以在片段中的图像视图中设置? [复制]

调整图像大小以在移动或小型设备上查看

CSS 和图像大小

如何找到联系人图像支持的最大图像大小?