使用Python/Django上传大文件

tde*_*lam 24 python django

我想知道使用Django/Python通过Web应用程序上传大小约为4GB的文件是否有任何后果?我记得在过去使用Java的流式上传是首选的方法但是今天仍然这样做或者使用Django/Python这样做是否完全安全?

ada*_*ish 25

Django默认情况下,如果上传的文件数据小于2.5MB,则将其放入内存中.更大的内容将写入服务器的/tmp目录,然后在传输完成时复制.许多Django的文件上传设置都可以自定义,文档中提供了详细信息.您还可以自定义文件处理,您当然希望这样做.

在我们考虑任何技术限制之前,使用浏览器上传这些大文件会给用户带来非常糟糕的体验.没有关于传输方式的反馈(尽管谷歌浏览器确实以百分比显示上传状态)并且无法暂停或恢复传输.

您也可能在服务器上遇到问题.除了处理流数据所需的每个线程的极长时间外,您还有时间将系统将生成的文件复制/tmp到正确的位置.

除非您非常有信心可以预见到服务器可能与上传有任何问题,否则我建议这是一个坏主意.很难通过谷歌找到这方面的任何信息,似乎有很多描述大文件上传问题的点击.

虽然Django在技术上能够接收这么大的上传文件,但非常糟糕的用户体验和技术难度意味着这可能不是最好的方法.您是否考虑过使用专用软件来处理文件传输?

  • ad adamnfish,感谢您的全面回应.我考虑过单独的服务,我唯一的问题是这是针对特定群组的特定网络应用,他们将上传他们创建的完整电影,可以是~4GB,所以我设置了4GB的限制.我们的想法是,他们将能够上传这些文件,并将与他们的帐户绑定.他们的帐户中可以包含多个文件.我知道用户体验,他们也是如此,他们很好,我只需要找出最好的方法来做到这一点,所以没有服务器问题 (3认同)
  • 使用[`django-chunked-uploads`](https://github.com/juliomalegria/django-chunked-upload)!(免责声明:我写了那个图书馆). (2认同)

小智 6

最后的答案涵盖了它.我们经常上传2.5mb +(但通常不上传4GB)

adamnish链接是正确的,请参阅此代码段(从他的链接到django docs)关于将文件写入磁盘,而不是先将其放入内存:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)
Run Code Online (Sandbox Code Playgroud)

有关"chunks"调用的更多信息:https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks

页面包括如何设置"块"大小等.


joo*_*ost 5

对于未来的读者:要增加内存存储允许最大文件大小,请在您的settings.py:

FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # make it 5Mb instead of 2Mb
Run Code Online (Sandbox Code Playgroud)

当然,这对 4Gb 没有帮助。

  • 是的,很容易确定。我最初的问题(几年前)更多地与上传非常大的文件的可能问题有关。我已经完成了那个申请。解决方案是使用 celery 和 rabbit mq 来排队上传。该应用程序已经运行了 8 年,可以完美地上传 100GB 的视频文件并对其进行编码。 (9认同)