使用django存储和boto保存另一个同名文件
我有一个模型使用django存储和boto保存另一个同名文件,django,amazon-s3,boto,django-storage,Django,Amazon S3,Boto,Django Storage,我有一个模型Profile和一个与其关联的ImageField 图像上载到AWS S3 bucket,以便使用django存储和boto进行存储 如果我上传一个文件名已经存在的图像(eg:sample.png)Django默认情况下会将新文件另存为sample_1.png,将图像上传到AWS S3时该文件不起作用。有没有办法解决这个问题 如何将已存在文件名的图像上载到AWS S3而不覆盖它?如果您已在settings.MYMODEL\u FILES\u location中定义了存储桶位置,则可以
Profile
和一个与其关联的ImageField
图像上载到AWS S3 bucket,以便使用django存储
和boto
进行存储
如果我上传一个文件名已经存在的图像(eg:sample.png
)Django默认情况下会将新文件另存为sample_1.png
,将图像上传到AWS S3时该文件不起作用。有没有办法解决这个问题
如何将已存在文件名的图像上载到AWS S3而不覆盖它?如果您已在settings.MYMODEL\u FILES\u 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))
S3BOToRage的构造函数可以使用关键字参数“acl”来设置上传文件的权限,例如acl='private'显示您说“不工作”的代码。