我想知道使用Django / Python通过网络应用程序上传大小约为4GB的文件是否有任何后果?我记得在过去使用Java的流式上传是首选的方法,但是现在还是这样做,或者用Django / Python这样做是否非常安全?
答案 0 :(得分:22)
Django默认情况下,如果上传的文件数据小于2.5MB,则将其放入内存中。任何较大的内容都将写入服务器的/tmp
目录,然后在传输完成时复制。许多Django的文件上传设置都可以自定义,详细信息可在the documentation中找到。您也可以自定义文件处理,您当然希望这样做。
在考虑任何技术限制之前,使用浏览器上传大型文件会给用户带来非常糟糕的体验。没有关于转移如何进行的反馈(尽管谷歌浏览器确实以百分比显示上传状态)并且无法暂停或恢复转移。
您也可能在服务器上遇到问题。除了处理流数据每个线程的时间非常长,您还有时间将结果文件从/tmp
复制到正确的位置。
除非您非常有信心可以预见服务器上传时可能遇到的任何问题,否则我建议这是一个坏主意。很难通过谷歌找到这方面的任何信息,似乎有很多点击描述大文件上传的问题。
虽然Django在技术上能够接收这么大的上传文件,但是非常差的用户体验和技术难度意味着这可能不是最好的方法。您是否考虑过使用专用软件来处理文件传输?
答案 1 :(得分:5)
最后一个答案涵盖了它。我们经常上传2.5mb +(但通常不是4gb)
adamnish链接是正确的,请参阅此代码段(来自他的link to django docs)关于将文件写入磁盘,而不是先将其放入内存:
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
页面包含如何设置“块”大小等。
答案 2 :(得分:1)
对于将来的读者:
要在内存中存储max filesize allowed,请在settings.py
中设置以下内容:
FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880 # make it 5Mb instead of 2Mb
当然,这对于4Gb不会有帮助。