使用 django-storage 和 boto 保存另一个同名文件
Saving another file with same name using django-storage and boto
我有一个模型 Profile
和一个与之关联的 ImageField
。
图像上传到 AWS S3 存储桶 以使用 django-storages
和 boto
进行存储。
如果我上传一个文件名已经存在的图像(eg: sample.png
) Django 默认情况下会将新文件保存为 sample_1.png
这是将图像上传到 AWS S3 时无法正常工作。有办法解决这个问题吗?
如何将具有现有文件名的图像上传到 AWS S3
而不覆盖它?
鉴于您已在 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='private'
我有一个模型 Profile
和一个与之关联的 ImageField
。
图像上传到 AWS S3 存储桶 以使用 django-storages
和 boto
进行存储。
如果我上传一个文件名已经存在的图像(eg: sample.png
) Django 默认情况下会将新文件保存为 sample_1.png
这是将图像上传到 AWS S3 时无法正常工作。有办法解决这个问题吗?
如何将具有现有文件名的图像上传到 AWS S3
而不覆盖它?
鉴于您已在 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='private'