我正在尝试在我的
django
应用程序中上传图像文件之前对其进行压缩。我在一个很好的代码片段网站上找到了这个代码: https://djangosnippets.org/snippets/10460/,但是它在python3
中无法运行。我认为问题可能与str
或byte
有关。有人建议使用BytesIO
代替StringIO
。所以,我将我的代码编辑成这样。from django.db import models
from django.core.urlresolvers import reverse
from django.utils import timezone
from django.utils.text import slugify
from django.core.files.uploadedfile import InMemoryUploadedFile
from PIL import Image as Img
from io import StringIO, BytesIO
def upload_location(instance, file_name):
return "{}/{}/{}/{}".format(
"album",
instance.day,
instance.week,
file_name
)
class Album(models.Model):
DAYS = (
('Sun', '일요일'),
('Mon', '월요일'),
)
name = models.CharField(max_length=50)
description = models.CharField(max_length=100, blank=True)
image = models.ImageField(upload_to=upload_location)
day = models.CharField(max_length=3, choices=DAYS)
week = models.IntegerField()
slug = models.SlugField(unique=True, allow_unicode=True)
date = models.DateField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['day', 'week']
def __str__(self):
return "{} - {}주차".format(self.get_day_display(), self.week)
def get_absolute_url(self):
return reverse(
"album:album_detail",
kwargs={
"slug": self.slug
}
)
def save(self, *args, **kwargs):
if not self.id:
self.slug = self.slug + "주차"
if self.image:
img = Img.open(BytesIO(self.image.read()))
if img.mode != 'RGB':
img = img.convert('RGB')
img.thumbnail((self.image.width/1.5,self.image.height/1.5), Img.ANTIALIAS)
output = BytesIO()
img.save(output, format='JPEG', quality=70)
output.seek(0)
self.image= InMemoryUploadedFile(
output,'ImageField',
"%s.jpg" %self.image.name.split('.')[0],
'image/jpeg',
output.len, None
)
super().save(*args, **kwargs)
但是出现了一个错误:'_io.BytesIO'对象没有属性'len'
--> 我的代码中的output.len
出现了错误。
我开始怀疑使用BytesIO
而不是StringIO
的方式是否正确。
同时需要一些帮助来编辑我的代码,谢谢。
BytesIO
对象数据的长度。然后,你可以使用len(buffer)
来获取其长度。此外,你还需要使用buf.release()
释放缓冲区view
,以便关闭BytesIO
对象(出于某种原因,你似乎没有这样做)。 - SevanteriBytesIO
对象的大小而不仅仅是缓冲区的大小。您可以使用sys.getsizeof
来获取它。 - Sevanteri