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

标签 django amazon-s3 boto django-storage

我有一个型号ProfileImageField与之相关联。

图片上传到 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)'

关于django - 使用 django-storage 和 boto 保存另一个同名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36579637/

相关文章:

python - 如果 AWS 实例没有使用 Python 关联的名称标签,则无法打印 "Unknown"

python - Django——使用 inspectdb 时清空数据库

python - 如何在 DRF 中获取图像的完整 url?

amazon-web-services - AWS CodeBuild buildspec.yml递归获取所有文件和子文件夹

amazon-web-services - AWS Amplify 模拟存储

css - 在发布到 AWS S3 之前如何压缩/压缩我的 mimified .js 和 .css 文件?

django - 连接到 Amazon Web Services 时 httplib.HTTPSConnection 超时

python - 无法检索 python/boto 中的已知 key

python - 运行基于 Django 的 MongoDB Web 管理员时出错

django - 如何在Django中使用ForeignKey初始化一个空对象?