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

Gow*_*ham 4 django amazon-s3 boto django-storage

我有一个模型,ProfileImageField与之相关联.

使用和将映像上载到AWS S3存储桶以进行存储.django-storagesboto

如果我上传一个文件名已经存在的图像(eg: sample.png)Django默认会保存新文件,sample_1.png因为在将图像上传到AWS S3时它不起作用.有没有办法解决这个问题?

如何在AWS S3不覆盖的情况下上传具有现有文件名的图像?

hha*_*lai 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))
Run Code Online (Sandbox Code Playgroud)

S3BotoStorage的构造函数可以使用关键字参数"acl"来设置上传文件的权限,例如acl ='private'