我有一个类似的简单模型来存储和跟踪用户上传的文档:
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'