我有一个与之关联的模型Profile
和ImageField
。
使用django-storages
和boto
将图片上传到 AWS S3广告管理进行存储。
如果我上传的图片文件名已经存在(eg: sample.png
) Django ,默认会将新文件保存为sample_1.png
,这在上传时无效图像到AWS S3。有没有办法解决这个问题?
如何将包含现有文件名的图像上传到AWS S3
而不覆盖它?
答案 0 :(得分:6)
鉴于您已在settings.MYMODEL_FILES_LOCATION中定义了您的存储桶位置,您可以使用以下命令在任意位置重命名上传的文件,这可能是从原始文件名派生的。以下片段将保存/ mymodelfiles /中的文件。可以在重命名方法中从实例对象访问模型实例属性,因此您可以例如从同一子目录下的同一用户上传文件。
import uuid
import os
from django.utils.deconstruct import deconstructible
from storages.backends.s3boto import S3BotoStorage
from django.db import models
from django.conf import settings
def path_and_rename(prefix, filename):
ext = filename.split('.')[-1]
filename = '{}.{}'.format(uuid.uuid4().hex, ext)
return os.path.join(prefix, filename)
def get_path_for_my_model_file(instance, filename):
return path_and_rename('mymodelfiles/', filename)
@deconstructible
class MyS3BotoStorage(S3BotoStorage):
pass
class MyModel(models.Model):
resources = models.FileField(
upload_to=get_path_for_my_model_file,
storage=MyS3BotoStorage(bucket=settings.MYMODEL_FILES_LOCATION))
S3BotoStorage的构造函数可以使用关键字参数" acl"设置上传文件的权限,例如ACL ='私人'