Django使用PIL和AWS S3上载时调整用户图像的大小并重命名

我一直在尝试在新的Django网站中找到一种管理用户图片上传的好方法。我使用PIL进行图像处理,并且图像存储在AWS S3中。

我需要的是

  • 用户最终得到的是一个图像文件,该文件将被新图像覆盖
  • 图片在上传时会自动调整大小并转换为JPG

这是我到目前为止所拥有的。

个人资料模型

from django.db import models
from django.contrib.auth.models import User
from utils.images import image_resize_rename


class Profile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    image = models.ImageField(default='users/profile_pics/default.png',upload_to='users/profile_pics')
    wp_id = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return f'{self.user.username} Profile'

    def save(self,*args,**kwargs):
        super().save(*args,**kwargs)
        image_resize_rename(self.image.name,(300,300),img_rename_basename=self.user.username)

utils.images.image_resize_rename

import io
import os
from django.core.files.storage import default_storage as storage
from PIL import Image


def image_resize_rename(img_name,img_size,img_rename_basename=None):
    read_img = storage.open(img_name,'r')
    img = Image.open(read_img)
    if img.width > img_size[0] or img.height > img_size[1]:
        img.thumbnail(img_size)
    in_mem_file = io.BytesIO()
    rgb_img = img.convert('RGB')
    rgb_img.save(in_mem_file,format='JPEG')
    head,tail = os.path.split(img_name)
    if img_rename_basename:
        write_img_name = os.path.join(head,img_rename_basename + '.jpg')
    else:
        write_img_name = os.path.join(head,tail.split('.')[0] + '.jpg')
    write_img = storage.open(write_img_name,'w+')
    write_img.write(in_mem_file.getvalue())
    write_img.close()
    read_img.close()
    if os.path.exists(img_name) and write_img_name != img_name:
        storage.delete(img_name)

这似乎是从用户图像上传中创建一个jpg,使其在S3中达到所需的大小和名称(使用用户的用户名作为基本名称),然后用户配置文件仍然使用原始上传。

因此,我最终得到两个文件(原始文件,重命名的文件/调整大小的文件),并且用户个人资料使用相同的文件。

非常感谢任何帮助。也许正确的方法完全不同。

pspg44oec 回答:Django使用PIL和AWS S3上载时调整用户图像的大小并重命名

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3150426.html

大家都在问