Py学习  »  Django

Django-S3-访问文件元数据

Daniel • 2 年前 • 207 次点击  

我有一个类似的简单模型来存储和跟踪用户上传的文档:

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'
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/158987
 
207 次点击