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

时间:2018-02-14 10:46:09

标签: 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)

我正在创建一个视图,其中链接到配置文件(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'

在我看来,我在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')行崩溃。

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

2 个答案:

答案 0 :(得分:4)

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

  

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

而不是$date = $_POST['datetimepicker']; $parsedDate = date('Y-m-d h:i:s', strtotime($date)); 在您的代码中使用file.path

file.name

答案 1 :(得分:1)

您可能想要查看File对象。它允许您以大量Pythonic方式操作文件,但利用Django项目的存储设置。在我的例子中,这允许我在本地使用本地磁盘存储,在生产中使用S3:

https://docs.djangoproject.com/en/2.0/ref/files/file/

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

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

祝你好运!