2016-04-12 51 views
3

我有一個和它相關的模型ProfileImageField使用django-storage和boto保存另一個具有相同名稱的文件

圖片上傳到AWS S3存儲桶存儲使用django-storagesboto

如果我上傳的圖片中已經存在(eg: sample.pngDjango的默認情況下,將新的文件保存爲sample_1.png同時上傳到AWS S3圖像這是不工作的文件名。有沒有辦法解決這個問題?

如何上傳已存在文件名的圖像到AWS S3而不覆蓋它?

+0

顯示您說的「不工作」的代碼。 – mootmoot

回答

3

鑑於您在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'

相關問題