Django - 用户在视图中上传的 S3 文件

Jas*_*per 2 python django django-file-upload

我有一个页面,用户可以在其中将 PDF/图像文件上传到他们的个人资料。这些文件的模型相对简单:

class ResumeItemFile(models.Model):
    item = models.ForeignKey(ResumeItem, related_name='attachment_files')
    file = models.FileField(
    max_length=255, upload_to=RandomizedFilePath('resume_attachments'),
    verbose_name=_('Attachment'))
    name = models.CharField(max_length=255, verbose_name=_('Naam'), blank=True)
Run Code Online (Sandbox Code Playgroud)

我正在创建一个视图,其中链接到配置文件 ( item) 的所有文件都收集在一个 .zip 文件中。我在本地工作,但在生产中我运行在以下错误中NotImplementedError: This backend doesn't support absolute paths.

主要区别在于,在生产过程中,媒体文件是通过 S3 提供的

MEDIA_URL = 'https://******.s3.amazonaws.com/'
STATIC_URL = MEDIA_URL

DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)

在我看来,我在attachments变量中创建了一个 ResumeItemFile 列表,它是一个如下所示的 dict列表:{'filename', ResumeItemFileObject}

            for file in attachments:

                storage = DefaultStorage()
                filename = file[1]
                file_extension = str(file[0].file).split('.')[-1]
                file_object = storage.open(file[0].file.path, mode='rb')                   
                filename, file_object.read())
                file_object.close()
Run Code Online (Sandbox Code Playgroud)

虽然这在本地工作正常,但在暂存时它会在线上崩溃file_object = storage.open(file[0].file.path, mode='rb')

如果后端不支持绝对路径,我该如何选择正确的文件?有谁知道我做错了什么?

aby*_*009 6

我认为这个问题是因为在 s3boto 存储类中没有实现 path() 方法。根据 Django 文档,

对于无法从本地文件系统访问的存储系统,这将引发 NotImplementedError。

而不是在您的代码中file.path使用file.name

# file_object = storage.open(file[0].file.path, mode='rb')    
file_object = storage.open(file[0].file.name, mode='rb')
Run Code Online (Sandbox Code Playgroud)