我一直在尝试在新的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中达到所需的大小和名称(使用用户的用户名作为基本名称),然后用户配置文件仍然使用原始上传。
因此,我最终得到两个文件(原始文件,重命名的文件/调整大小的文件),并且用户个人资料使用相同的文件。
非常感谢任何帮助。也许正确的方法完全不同。