【发布时间】:2016-09-17 02:54:19
【问题描述】:
到目前为止,我一直将图像文件名存储在 CharField 中,并将实际文件直接保存到 S3。这是我自己使用的一个很好的解决方案。我想重新考虑使用 ImageField,因为现在会有其他用户并且文件输入验证是合适的。
在阅读 the docs 和 the source code 的 FileField(这似乎本质上是 ImageField 减去 Pillow 检查和维度字段更新功能)后,我有几个问题没有得到完全回答。
1) 为什么要使用 ImageField?或者更确切地说,为什么要使用 FileField?当然,它对于快速简单的表单和插入到 Django 模板很方便。但是是否有任何实质性的原因,例如。它是否明显受到攻击和恶意上传的保护?
2) 如何写入字段文件?如果instance.imagefield(或者是instance.imagefield.file?)可以读取该文件是正确的,如果我想写入它,我可以简单地执行以下操作吗?
@receiver(pre_save, sender=Image)
def pre_save_image(sender, instance, *args, **kwargs):
instance.imagefield = process_image(instance.imagefield)
3) 如果随机生成的文件名已经存在,如何尝试使用特定文件名保存,然后使用新文件名重试?例如,我现在使用我的代码执行此操作,如何使用 ImageField 完成?我想在模型层执行此操作,因为如果我在视图层重复尝试,那么pre_save 处理将再次运行,这是贫民窟(即使它不太可能在生命周期内进行第二次尝试)服务)。
for i in range(tries):
try:
name = generate_random_name()
media_storage.save(name + '.jpg', ContentFile(final_bytes))
break
except:
pass
4) 在models.py pre_save 和post_save 信号以及实际模型的save() 中,我如何判断是否有文件与请求一起进入?即我想知道是否有新图像要保存,或者是否没有图像(对象中的某些其他字段正在更新并且图像本身保持不变)。
【问题讨论】:
-
这真的应该是你知道的四个不同的问题。奇怪的是,你没有吸引任何密切的选票!我的建议是让你现在结束这个问题。如果您对特定点 1、2、3、4 的任何答案不满意,请仅针对该点发布另一个问题。这样,您将获得更好、更具体的答案,并提出更具体的问题。
-
感谢您的建议,您的解决方案会奏效。我还不想结束这个问题,仍然想收到 dkarchmer 的回复:re: uploading directly to S3
-
那么你从这里去了哪里?
标签: django django-models