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默认的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已经帮你做了,除非你自己需要对上传文件做特殊处理。
相关文章推荐
- ASP实现文件上传的方法
- .net文件上传时实现通过文件头确认文件类型的方法
- asp.net 文件上传与刷新与asp.net页面与iframe之间的数据传输
- ASP的chr(0)文件上传漏洞原理和解决方法介绍
- asp.net上传文件到数据库的解决方案
- javascript实现校验文件上传控件实例
- ajax 异步上传带进度条视频并提取缩略图
- jQuery实现文件上传进度条特效
- 分享20多个很棒的jQuery 文件上传插件或教程
- jquery插件ajaxupload实现文件上传操作
- django中使用jquery ajax post数据出现403错误的解决办法(两种方法)
- django使用ajax post数据出现403错误如何解决
- MVC中基于Ajax和HTML5实现文件上传功能
- js jquery分别实现动态的文件上传操作按钮的添加和删除
- asp.net HTML文件上传标签
- PHP中文件上传的一个问题
- 与文件上传有关的php配置参数总结
- Serv-U中禁止某类文件上传的设置方法
- PHP 文件编程综合案例-文件上传的实现
- 在服务端进行目录建立、删除,文件上传、删除的过程的php代码