【问题标题】:Errno 22 invalid mode ('rb') or filename - django custom file storageErrno 22 无效模式 ('rb') 或文件名 - django 自定义文件存储
【发布时间】:2015-11-12 13:04:41
【问题描述】:

我已经覆盖了 django 中的默认文件存储,以将模型图像字段保存​​在 amazon s3 中。

只有open 方法没有按预期工作,我得到:

[Errno 22] invalid mode ('rb') or filename: http://image.buzzhearts.com/media/2015/11/12/11/99f0301c46d7945c91b16b0c2d61ab13.jpg

文件已经在 s3 中:http://image.buzzhearts.com/media/2015/11/12/11/99f0301c46d7945c91b16b0c2d61ab13.jpg

代码:

class CS3Storage(FileSystemStorage):
    def open(self, name, mode='rb'):
        return File(open(self.path(name), mode)) # <-- problem

    def path(self, name):
        # returns http://image.buzzhearts.com/media/2015/11/12/11/99f0301c46d7945c91b16b0c2d61ab13.jpg
        return 'http://image.buzzhearts.com/%s' % name

我错过了什么?我想,我必须首先从 s3 获取图像文件,例如requests 然后打开对吗?

【问题讨论】:

    标签: python django file-io amazon-s3


    【解决方案1】:

    open() 需要一个文件名,它不支持 url。

    如果你想获取 url,你需要使用像 requests 这样的库。由于该文件位于 S3 上,因此您可以使用 boto 之类的工具。

    您可能会发现使用django-storages-redux 更容易,而不是编写自己的文件存储。

    【讨论】:

    • 谢谢,是的,我知道,但我的存储桶在法兰克福,他们不支持 sigv2。 django-storages 和 django-storages-redux 让我很头疼。所以我决定使用自己的存储空间。
    • 你的意思是,我可以在 open() 存储方法中使用 boto 吗?
    • 你的最后一个问题是关于django-storages,所以我想确保你知道django-storages-redux
    • 不,我的意思是你可以使用 boto 从存储桶中获取文件,而不是 open(),而不是in open()
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多