繁体   English   中英

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

[英]Django - User uploaded S3 files in the view

我有一个页面,用户可以在其中上传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)

我正在创建一个视图,其中链接到配置文件( item )的所有文件都收集在一个.zip文件中。 我已经在本地工作了,但是在生产环境中,我遇到了以下错误NotImplementedError: This backend doesn't support absolute paths.此后端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'

在我看来,我在attachments变量中创建了ResumeItemFile列表,该列表是类似以下内容的字典列表: {'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()

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

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

我认为出现此问题是因为在s3boto存储类中,未实现path()方法。 根据Django文档,

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

在代码中使用file.name代替file.path

# file_object = storage.open(file[0].file.path, mode='rb')    
file_object = storage.open(file[0].file.name, mode='rb')

您可能需要查看File对象。 它允许您以很大程度上Python的方式操作文件,但可以利用Django项目的存储设置。 就我而言,这使我可以在本地使用本地磁盘存储以及在生产环境中使用S3:

https://docs.djangoproject.com/zh-CN/2.0/ref/files/file/

这将抽象出您正在编写的许多样板。 这里有一个例子:

https://docs.djangoproject.com/zh-CN/2.0/topics/files/#the-file-object

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM