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'