我最近一直在使用django
进行体验我希望能够通过imagemagick在模型保存功能上运行上传的文件,我意识到这是不可能的,因为在实例保存之前文件不可用
我已经开始工作了,在开始时调用了save,然后允许访问上传的文件,然后在填充其他字段后重新保存
有没有更好的方法来实现这一目标?调用保存功能两次感觉有点不对
class uploadedFiles(models.Model):
orignal_image = models.FileField(upload_to='userimages/')
user = models.ForeignKey(User)
description = models.TextField(blank=True)
def __unicode__(self,force_insert=False, force_update=False):
return "%s uploaded by %s" % (self.orignal_image.path, self.user)
def save(self, force_insert=False, force_update=False):
super(uploadedFiles, self).save()
s = ''
cmd = subprocess.Popen(['identify', '-verbose', self.orignal_image.path], stdout=subprocess.PIPE)
for line in cmd.stdout:
s += line
self.description = s
super(uploadedFiles, self).save()
答案 0 :(得分:0)
最好使用成像库函数来收集图像元数据。然后,您只需要从图像字段的FileStorage
实例中读取图像数据。只需检查documentation of file uploads即可。此外,当使用Django的ImageField
时,它会检查上传的文件以查看是否是有效的图像文件,检查ImageField
的代码作为基线以获取有关图像的更多信息。
我会为模型定义一个clean
方法,这将在调用模型的save
方法之前调用。在clean
中,然后使用PIL函数检查图像字段的数据流以获取元数据(或者您要为此使用的任何库,只要它接受数据流,不物理文件),然后用元数据填充描述字段。
使用Django的存储API更好,因此您可以从存储在云中的文件(如Amazon S3)中提取元数据,而不仅仅是存储在本地文件系统中的元数据,从而使代码在部署中更具可移植性。
答案 1 :(得分:-1)