Django-filer PIL 转换和覆盖原始文件
Django-filer PIL convert and override original
为了用转换为 webp 版本的文件替换原始文件,我在 models.py:
中执行了以下操作
django==2.2.17
django-filer==2.0.2
Pillow==8.0.0
class Provaa(File):
data = models.DateTimeField(auto_now=True,)
class Meta:
managed = True
verbose_name = 'Allegato'
def convert_to_webp(self):
extension = ['jpeg', 'png', 'jpg', 'img']
if any(ext in self.file.name.lower() for ext in extension):
try:
img = Image.open(self.file)
correggi_nome = self.file.name.split('.')[0]
img.save(correggi_nome + '.webp','webp')
logger.error('img.save save another copy of the file not repalce the original!')
except Exception as ex:
logger.error(ex)
def save(self, *args, **kwargs):
self.convert_to_webp()
super(Provaa, self).save()
这正确地保存了一个 webp 文件,但在当前项目文件夹中并没有替换原始文件。
ipdb> type(self.file.file)
<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
ipdb> type(self.file)
<class 'filer.fields.multistorage_file.MultiStorageFieldFile'>
ipdb> type(img)
<class 'PIL.PngImagePlugin.PngImageFile'>
我尝试用 img 替换 self.file,但失败了。
我不需要保留原始文件,只保留转换后的文件。
只需创建一个 DRF 序列化程序并在验证期间移动 运行 的模型方法。
为了用转换为 webp 版本的文件替换原始文件,我在 models.py:
中执行了以下操作django==2.2.17
django-filer==2.0.2
Pillow==8.0.0
class Provaa(File):
data = models.DateTimeField(auto_now=True,)
class Meta:
managed = True
verbose_name = 'Allegato'
def convert_to_webp(self):
extension = ['jpeg', 'png', 'jpg', 'img']
if any(ext in self.file.name.lower() for ext in extension):
try:
img = Image.open(self.file)
correggi_nome = self.file.name.split('.')[0]
img.save(correggi_nome + '.webp','webp')
logger.error('img.save save another copy of the file not repalce the original!')
except Exception as ex:
logger.error(ex)
def save(self, *args, **kwargs):
self.convert_to_webp()
super(Provaa, self).save()
这正确地保存了一个 webp 文件,但在当前项目文件夹中并没有替换原始文件。
ipdb> type(self.file.file)
<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
ipdb> type(self.file)
<class 'filer.fields.multistorage_file.MultiStorageFieldFile'>
ipdb> type(img)
<class 'PIL.PngImagePlugin.PngImageFile'>
我尝试用 img 替换 self.file,但失败了。 我不需要保留原始文件,只保留转换后的文件。
只需创建一个 DRF 序列化程序并在验证期间移动 运行 的模型方法。