使用 boto 的 django-storages - 无法上传 mp3,但可以上传图像。另外,还承受着 HTTP 307 的痛苦

2024-01-25

我使用 django-storages (1.1.4) 的 boto (2.2.1) 后端将文件上传到 S3 存储桶。它适用于图像,但当我尝试上传电影文件(小 mov、小 avi)或 mp3 时,我收到“管道损坏”错误。

这很奇怪。

深入研究 Django 回溯,我看到以下异常:

boto.https_connection.InvalidCertificateException

这符合我使用 Cyber​​duck 直接检查存储桶的体验:有时它会抱怨我的证书之间不匹配*.s3.amazonaws.com和域*.s3-external-3.amazonaws.com

事实上,存储桶日志记录显示我正在接受 HTTP 307 临时重定向。 AWS 是否可能以一种方式发送某些内容类型,而以另一种方式发送其他内容类型,但 boto/something 无法完全跟上?电影的上传似乎确实击中了 S3 两次,而图像则击中了一次,因此 boto 很可能正在应对 307 罚款(boto 中 307 支持的封闭票据已经有几年了),因此它可以好吧,还有别的事情发生。

但什么?我从愉快而富有成效的一天变成了低谷,这非常令人沮丧。

对于可能发生的情况和/或尝试解决此问题有什么建议吗?

(请注意,这对于 boto S3 后端或简单的 S3 后端会失败 - 只是 boto 给了我看起来更具体的错误)


我写这个作为答案,因为它太长,无法容纳评论。它并不能真正回答您的问题,但也许可以帮助您找到答案。

您收到的 307 重定向正在发生,因为存储桶位于 eu-west-1 中,但您正在访问标准 s3.amazonaws.com 端点。 S3 使用一些 DNS 魔法和 HTTP 重定向将流量从通用 S3 端点路由到正确的区域端点。

为了实现这一点,大多数 S3 客户端使用“子域”引用方案,将存储桶名称添加到请求中的主机名前面。因此,如果您尝试访问您的存储桶,则请求中的 Host 标头在 boto 中默认为 foofoofoo-bar.s3.amazonaws.com,然后使用 DNS 魔法和 HTTP 重定向,S3 最终会获取您的存储桶。请求到正确的地方。这一切都应该在博托自动发生。

如果您的存储桶名称包含“.”,此方法可能会导致问题。因为主机标头可能是 foofoofoo.bar.s3.amazonaws.com,并且由于 S3 端点上的通配符 SSL 证书仅适用于一级子域,因此存储桶名称中的句点会导致 SSL 证书验证失败。

这就是为什么我问“。”在您的存储桶名称中,但显然这不是问题。您是否可以从日志中提供更多上下文?我想看看证书验证错误之前发生了什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 boto 的 django-storages - 无法上传 mp3,但可以上传图像。另外,还承受着 HTTP 307 的痛苦 的相关文章

随机推荐