将大文件上传到Django存储并存储到AWS S3

4

我是一个新手Django开发者,我有一个项目需要上传大文件(5G+的大小)。

我目前使用以下技术:

  • django-storages
  • Amazon S3
  • Django 3.0.2
  • Python 3.7.6
  • JQuery 3.1

在文档中,它说当文件大于2.5MB时,它会进入TemporaryFileUploadHander,这意味着它首先会进入 /tmp 目录,当上传完成后,再将文件移动到媒体根目录(在我的情况下是Amazon S3)。

现在,要求将文件流式上传到Amazon S3。例如: 20Gb的文件应该分段流式上传到Amazon S3。 如何实现将文件直接上传到Amazon S3而不必先在 /tmp 目录中进行处理?

请给我一些提示。


文件从哪里来?它们是由用户通过Web应用程序(例如Google Drive)上传的吗? - Horatiu Jeflea
嗨@HoratiuJeflea,用户将通过这个使用Django制作的网站上传它们。 - Yejin
2
还可以参考AWS关于从Web或移动应用程序直接上传到S3的博客。 - djvg
@djvg 非常感谢您提供这个链接!让 S3 来处理文件上传的重活应该是首选解决方案。 - SaturnFromTitan
1个回答

2
从Web客户端,到Django,再到S3流式传输文件是不可能的。最好的解决方案是从客户端JS将文件拆分成块,然后逐个上传它们。示例代码在这里
但是,这种解决方案仍然会将较小的文件保存到磁盘中。

您好@Horatiu先生,我想确认一下这种方法,如果我在JS客户端中进行分块处理,意味着Django也会将文件上传到S3中,而不是等待文件在/tmp目录中完成后再上传到S3,我正在尝试搜索此内容,但我找不到答案。这很令人困惑,因为我发现了这个链接:https://stackoverflow.com/questions/53449148/django-chunked-uploads-to-amazon-s3,建议我需要在上传到S3之前重新组装文件。谢谢回复。 - Yejin
你可以将这些块上传到S3。接下来的事情是定期合并这些块的作业。 - Horatiu Jeflea
还可以查看https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html。您可以在每个块上传中指定最后一个块。 - Horatiu Jeflea
嗨@horatiu,我们已经决定使用boto3进行向S3的分块上传。谢谢 - Yejin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接