您的位置:首页 > 编程语言 > Go语言

django上传文件原理解析

2015-12-10 20:49 1091 查看
最近还是被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()

完全没有必要,你做的django已经帮你做了,除非你自己需要对上传文件做特殊处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django 文件上传