使用django-storage和boto保存另一个具有相同名称的文件

时间:2016-04-12 16:59:23

标签: django amazon-s3 boto django-storage

我有一个与之关联的模型ProfileImageField

使用django-storagesboto将图片上传到 AWS S3广告管理进行存储。

如果我上传的图片文件名已经存在(eg: sample.png Django ,默认会将新文件保存为sample_1.png,这在上传时无效图像到AWS S3。有没有办法解决这个问题?

如何将包含现有文件名的图像上传到AWS S3而不覆盖它?

1 个答案:

答案 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 ='私人'