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

时间:2016-09-17 11:20:45

标签: python django heroku amazon-s3 large-files

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

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

其他答案中的要点有效。对“无论如何我可以在不使用JavaScript的情况下通过Django后端上传大文件”的问题的简短回答是“并非没有切断Heroku”。

请记住,传输到你的dynos的任何数据都要经过Heroku的路由网格,这就是强制执行30秒的请求限制以保存自己的有限资源。任何类型的长时间运行事务都会占用可用于提供其他请求的带宽/计算/等,因此Heroku应用限制来帮助保持数千个动态的数据移动。上传文件时,首先会受到服务器客户端带宽的限制。然后,除了你的dyno实际处理的任何处理之外,你将受到你的dynos和S3之间的带宽的限制。

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