Django - S3 - доступ к метаданным файла

У меня есть простая модель следующего вида для хранения и отслеживания загруженных пользователем документов:

class Document(...):
    file = models.FileField(..., upload_to=upload_to)
    ...

Я использую пакет django-storage для загрузки этих файлов непосредственно на s3.

Однако s3 ограничен в том, какие символы разрешены в именах файлов. Я хочу сохранить оригинальное имя файла в метаданных загруженного файла.

Я могу легко установить метаданные в моем методе upload_to, но мне трудно понять, как я могу получить доступ к этим метаданным без хакерского обходного пути. Мне нравится этот процесс, потому что я могу видеть оригинальное имя файла в самом S3.

def upload_to(instance, filename):
    """ custom method to control how files are stored in s3 """

    # set metadata on uploaded file:    
    instance.file.storage.object_parameters.update({
        "Metadata" : {
            "original_name" : filename
        }
    })

    ...

В настоящее время я использую boto3 для захвата метаданных, но есть ли более чистый обходной путь?

def _get_original_file_name(file_field):
    """ method to extract metadat from a file field """

    # set up client:
    s3 = boto3.client('s3')

    # get head object:
    head_object = s3.head_object(
        Bucket=settings.AWS_STORAGE_BUCKET_NAME,
        Key=file_field.name,
    )

    # extract meta data set in upload_to method:
    original_name = head_object['Metadata']['original_name']

    return original_name

Одно решение:

Я также попытался создать пользовательский класс S3FileField, который расширяет класс FileField и включает вышеуказанный метод, однако я столкнулся со следующей ошибкой. Я мог бы использовать это пользовательское поле файла во всех моих моделях, имеющих файлы, если бы смог заставить его работать.

AttributeError: 'FieldFile' object has no attribute '_get_original_file_name'
Вернуться на верх