最近还是被django的上传大文件搞得晕头转向,转而看了这方面的原理,把自己的心得写了出来。
首先,我想说:如果你使用的是django默认的FileField的形式通过表单上传,那么其实你完全不需要管理如何上传,或者自己去写一个分块读取写入的函数,
这个是django已经帮你做完了。
表单接收到的上传文件数据在还没有被我们完全接收时,数据存放在哪里?
1默认,上传文件<2.5M,Django放在内存里
2大文件,会将文件写入到临时文件中
这个文件在临时文件路径中,上传完毕,将调用View中的
_Upload()方法将临时文件夹中的临时文件
分块写到上传文件的存放路径下,每块的大小为64K,写完后临时
文件将被删除。
注意第二点:django已经实现了把大文件拆分成块帮你读取,并实现上传,因此即使你存在大文件上传,速度比较慢,并不要紧,django已经帮你处理了。
了解到这里,我依然会把其他原理部分讲解一下:
headImg =request.FILES["headImg"]
request.FILES:文件怎么被存储在磁盘上或者内icunzhong
一个处理表单的视图将在request.FILES中接受文件数据,它是字典。
可以通过request.FILES[“file”]键来访问
uf = UploadFileForm(request.POST,request.FILES)
注意我们必须将request.FILES传递到表单的构造器中
这就是文件数据怎么和表单关联的。
处理上传的文件:
难点在于处理从request.FILES中获得的真实文件。
这个字典的每个输入都是UploadedFile对象(上传之后的文件的简单包装)
UploadedFile.read():从文件中读取整个上传的数据
UploadedFile.multiple_chunks():如果上传的文件足够大,需要分块就返回为真。默认为2.5M
UploadedFile.chunks() :产生器,返回文件的块
UploadedFile.name:上传文件的名字(不含前缀路径)
UploadedFile.size:以比特表示的上传文件的大小
因此,我们不需要对上上传做处理。
网上看到有人这样对上传文件处理:
def handle_uploaded_file(f): destination = open('some/file/name.txt','wb+') for chunk in f.chunks(): destination.write(chunk) destination.close()