在 Heroku 上使用 Django 将大文件上传到 AWS S3 Bucket 没有 30 秒的请求超时

Uploading Large files to AWS S3 Bucket with Django on Heroku without 30s request timeout

我有一个允许用户上传视频的 Django 应用程序。它托管在 Heroku 上,上传的文件存储在 S3 存储桶中。 在从 Django 应用程序获得预签名请求后,我正在使用 JavaScript 直接将文件上传到 S3。这是由于 Heroku 30s 请求超时。 无论如何,我可以通过 Django 后端上传大文件而不使用 JavaScript 并影响用户体验吗?

您应该考虑以下几点来解决您的问题。

  • 为什么你的文件不应该到达你的 django 服务器然后去 s3:将文件发送到 django 服务器然后将它们发送到 s3 只是浪费计算能力和带宽。下一个问题是,当您可以直接将文件发送到您的 s3 存储时,为什么将文件发送到 django 服务器。
  • 如何在不影响用户体验的情况下将文件上传到 s3:将文件发送到 django 服务器当然不是一个选项,因此您必须在前端处理这个问题。但是前端有其自身的局限性,例如有限的内存。它将无法处理非常大的文件,因为所有内容都会加载到 RAM 中,如果它是一个非常大的文件,浏览器最终将 运行 内存不足。我建议您使用 dropzone.js 之类的东西。它不会解决内存问题,但它肯定可以为用户提供良好的用户体验,例如显示进度条、文件数量等。

另一个答案中的观点是有效的。 "Is there anyway that i can possibly upload large files through Django backend without using JavaScript" 问题的简短答案是 "not without switching away from Heroku".

请记住,任何传输到您的测功机的数据都会通过 Heroku 的路由网格,这是强制执行 30 秒请求限制以节省其自身有限资源的原因。任何类型的 Long-运行 事务用完了 bandwidth/compute/etc 可用于服务其他请求,因此 Heroku 应用该限制来帮助保持事物在数千个测功机中移动。上传文件时,您首先会受到到服务器的客户端带宽的限制。然后,除了您的测功机实际进行的任何处理之外,您将受到测功机和 S3 之间带宽的限制。

文件越大,传输数据越有可能超过 30 秒超时,特别是对于不可靠网络上的客户端,在第 1 步中。创建从客户端到 S3 的直接路径是一个合理的妥协。