使用 django-storage 和 boto 保存另一个同名文件

Saving another file with same name using django-storage and boto

我有一个模型 Profile 和一个与之关联的 ImageField

图像上传到 AWS S3 存储桶 以使用 django-storagesboto 进行存储。

如果我上传一个文件名已经存在的图像(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'