Ben*_*rts 6 django amazon-s3 boto django-storage
FACEPALM UPDATE:事实证明我忘记/忽略了这样一个事实,即我使用来自https://github.com/gtaylor/django-athumb的旧版S3BotoStorage 作为我的默认存储(即使我安装了django-storage).当前版本的django-storages没有遇到这个问题.问题是内容类型标题在击中boto时是unicode,而boto urllib.quoteplus在将其发送到AWS之前使用unicode .这不是Boto的错,因为每个HTTP都必须以某种方式将头转换为非unicode字符串.有关更深入的分析,请参阅https://github.com/boto/boto/issues/1669.
原始问题
我正在使用django_storage的S3BotoStorage和FileField将文件上传到Amazon S3.这是我的领域:
downloadable_file = FileField(max_length=255, upload_to="widgets/filedownloads", verbose_name="file")
Run Code Online (Sandbox Code Playgroud)
在设置中:
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
Run Code Online (Sandbox Code Playgroud)
在上传/下载过程中一切正常.
但是,文件存储在我的存储桶中,内容类型不正确.当我查看AWS S3控制台中文件的元数据时,文件的Content-Type显示为"application%2Fpdf"而不是"application/pdf".

如果你说它无关紧要,那就重要了.谷歌Chrome的内置pdf阅读器将挂在pdf上,内容类型无效,客户端会引起我的注意.
这是通过django-storages/boto上传的文件的示例.如果您正在使用chrome的内置pdf阅读器,我认为它会挂起,就像我和报告此内容的客户一样.如果您使用的是非Chrome浏览器或adobe插件,或者将文件下载到磁盘,您可能会没问题.
如果我通过AWS控制台手动将内容类型元数据更改为'application/pdf'(它提供的标准选项之一),那么就可以了.
我认为这是一个内部错误,boto构建AWS策略文档以上传文件的方式,因为我没有做任何超出标准用法的事情.但是,我已经介绍了boto代码,无法找到它实际逃逸的位置.
有人可以建议一个解决方法,或者引导我查看boto中的违规代码,以便我可以修补它并提交拉取请求吗?
boto == 2.9.5 django-storages == 1.1.8
问题是我使用的是 django 存储的分叉/过时版本,在将内容类型标头发送到 boto 之前,它没有正确地将内容类型标头从 unicode 转换为字符串,boto 将 unicode 字符串转换为 ascii 字符串(根据 HTTP 标头的要求) urllib 的quoteplus转义机制。通过切换到当前版本的 django-storages 解决了该问题。
有关该问题的更详细分析,请参阅:https://github.com/boto/boto/issues/1669#issuecomment-27132112
| 归档时间: |
|
| 查看次数: |
1437 次 |
| 最近记录: |