使用Python/Django上传大文件
我在想,通过一个使用Django/Python的网页应用上传大约4GB大小的文件,会不会有什么影响?我记得以前用Java进行流式上传是比较推荐的方法,但现在还是这样吗?还是说用Django/Python上传这样的大文件是完全安全的呢?
3 个回答
最后的回答已经说得很清楚了。我们通常会上传超过2.5MB的文件(但一般不会达到4GB)。
adamnish提供的链接是正确的,看看这个代码片段(来自他的Django文档链接),它讲的是如何将文件写入磁盘,而不是先把它放在内存里:
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
关于“chunks”调用的更多信息:https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.chunks
页面上还包括如何设置“chunk”大小等内容。
给未来的读者们:
如果你想增加内存存储中允许的最大文件大小,可以在你的 settings.py
文件中设置以下内容:
FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # make it 5Mb instead of 2Mb
当然,这个方法对4Gb的文件是没用的。
Django 默认情况下会把上传的文件数据放在内存中,如果文件小于 2.5MB。超过这个大小的文件会被写入服务器的 /tmp
目录,等传输完成后再复制到正确的位置。Django 的文件上传设置可以根据需要进行调整,具体细节可以在 文档 中找到。你也可以自定义文件处理方式,这一点你肯定会想要做。
在考虑技术限制之前,使用浏览器上传这么大的文件会让用户体验非常糟糕。用户无法看到传输进度(虽然谷歌浏览器会显示上传的百分比),也没有办法暂停或恢复传输。
你还可能会在服务器上遇到问题。除了每个线程处理流数据所需的极长时间外,还要考虑系统将生成的文件从 /tmp
复制到正确位置所需的时间。
除非你非常有信心能够预见服务器在上传时可能遇到的任何问题,否则我建议这不是个好主意。通过谷歌很难找到相关信息,而且似乎有很多关于大文件上传问题的讨论。
虽然 Django 在技术上能够接收这么大的上传文件,但用户体验差和技术困难意味着这可能不是最佳方案。你有没有考虑使用专门的软件来处理文件传输呢?