将图像上传到Django admin,裁剪和缩放,并将其发送到Amazon S3而不在本地保存文件?

时间:2011-12-28 16:18:00

标签: django django-admin django-forms amazon-s3

我想允许用户通过Django管理员上传图像,在内存中裁剪和缩放该图像(可能使用PIL),并将其保存到Amazon S3而不将图像保存在本地文件系统上。我将在我的数据库中保存图像路径,但这是本地保存的图像的唯一方面。我想将此特殊图片上传窗口小部件集成到管理编辑页面上的普通模型表单中。

This question类似,但解决方案不使用管理界面。

有没有办法可以拦截保存操作,操作并将图像保存到S3,然后像正常一样保存图像路径和其他模型数据?如果我能够访问图像数据,我非常清楚如何裁剪和缩放并将图像保存到S3。

2 个答案:

答案 0 :(得分:4)

请参阅https://docs.djangoproject.com/en/dev/topics/http/file-uploads/#changing-upload-handler-behavior

如果图像小于特定大小,则只会将其存储在内存中,因此您可以调整FILE_UPLOAD_MAX_MEMORY_SIZE参数以满足您的需要。此外,您必须确保不访问这些上传图像的.path字段,因为这会导致它们被写入文件。相反,使用(例如).read()方法。我没有测试过这个,但我相信这会有效:

image = PIL.Image(request.FILES['my_file'])

答案 1 :(得分:0)

如果您不想触摸Django的Admin部分,那么您可以在模型save()方法中定义缩放。 但是在Django中使用ImageField时。 Django实际上可以为您节省开支。它有高度和宽度选项。

https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

为了上传到S3我真的建议使用django-storages后端:

https://bitbucket.org/david/django-storages/src(最好是S3-boto版本)

这样你基本上不必自己编写任何代码。您可以使用人们测试过的可用库和解决方案。