如何用django 上传多个文件上传xlsx文件

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!在我写的教程中的第八讲就有关于通讯录的上传处理,不过那时处理很简单。
首先是 form 要写正确,格式为:
&form enctype=&multipart/form-data& method=&POST& action=&/address/upload/&&
文件上传的input field的写法为:
&input type=&file& name=&file&/&
后台的处理是使用 request.FILES。它是一个Dict值,你可以:
file_obj = request.FILES.get(‘file’, None)
这里的’file’是与input field的名字一致的。如果file_obj不为空,它将是一个字典,通过测试可以得知它都有什么值。如果你参考
自带的 request_response.txt 文档,可以看到它主要有三个值:
content这是文件的内容
filename这是原文件名
content-type这是文件的mime类型
那么它放在哪里呢?应该是在内存中。因此接下来你可以对这个文件的内容进行处理了,是直接处理内容或保存到一个地方。
也许有人会问,那么 settings.py 中的 MEDIA_ROOT 是做什么用的。如果你不使用 django 的 Model 中的 FileField 或 ImageField 的话,它其实没有什么用。这个设置是用在 Model 的 FileField 中的。在创建一个 Model 时,如果你的 Model 中有与文件相关的字段,那么 django 会根据每个文件字段生成一系列的方法,如:get_fieldname_filename() get_fieldname_url() save_fieldname_file()。fieldname是根据你在 Model 中所起的名字来的。而 save_fieldname_file 需要两个参数,一个是文件名,另一个就是文件内容。因此,你可以使用这个方法来将上传的文件保存。那么保存到哪里去了呢?就是 MEDIA_ROOT 这个目录下。而 settings.py 中的 MEDIA_URL 就是用于 get_fieldname_url() 这个方法的。
因此,MEDIA_ROOT 只与 Model 有关。
— limodou @ 9:17 am
本站所有内容采用许可证。
Pythoner in 中国
Python开源项目
我的开源项目django上传文件原理解析
django上传文件原理解析
最近还是被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中的文件上传 - 推酷
django中的文件上传
记录一下django中上传文件相关的内容~ 以前对这方面的东西一直不太了解, 刚好有机会可以了解一下~
首先了解下文件究竟是如何上传的, 过程是什么样子的, 推荐看一下
, 讲的挺好的~
这里我们也简单试试~ 首先开一个web服务, 利用curl传个文件, 然后tcpdump抓个包:
curl -v -F 'july=@./ggxggxgl.txt' 127.0.0.1:8000/upload
下面是tcpdump的输出:
POST /upload HTTP/1.1
User-Agent: curl/7.32.0
Host: 127.0.0.1:8000
Accept: */*
Content-Length: 204
Expect: 101-continue
Content-Type: multipart/form- boundary=------------------------8f74314abd491e29
19:04:00.605356 IP 127.0.0.1.irdmi & 127.0.0.1.50595: Flags [.], ack 215, win 350, options [nop,nop,TS val
ecr ], length 0
E..4}.@.@..9.........@.....J..:....^.(.....
19:04:01.606728 IP 127.0.0.1.50595 & 127.0.0.1.irdmi: Flags [P.], seq 215:357, ack 1, win 342, options [nop,nop,TS val
ecr ], length 142
E.....@.@..H...........@..:....J...V.......
.!...!.&--------------------------8f74314abd491e29
Content-Disposition: form- name=&july&; filename=&ggxggxgl.txt&
Content-Type: text/plain
19:04:01.606838 IP 127.0.0.1.irdmi & 127.0.0.1.50595: Flags [.], ack 357, win 359, options [nop,nop,TS val
ecr ], length 0
E..4}.@.@..8.........@.....J..:....g.(.....
19:04:01.606888 IP 127.0.0.1.50595 & 127.0.0.1.irdmi: Flags [P.], seq 357:371, ack 1, win 342, options [nop,nop,TS val
ecr ], length 14
E..B..@.@..............@..:....J...V.6.....
.!...!..ggxggxgl abcd
19:04:01.606912 IP 127.0.0.1.irdmi & 127.0.0.1.50595: Flags [.], ack 371, win 359, options [nop,nop,TS val
ecr ], length 0
E..4}.@.@..7.........@.....J..:....g.(.....
19:04:01.606962 IP 127.0.0.1.50595 & 127.0.0.1.irdmi: Flags [P.], seq 371:419, ack 1, win 342, options [nop,nop,TS val
ecr ], length 48
E..d..@.@..............@..:....J...V.X.....
--------------------------8f74314abd491e29--
关键的地方在
Content-Type
这边. 这里有两个关键的属性:
, 后面实现跟这两个属性有关. 另外值得注意的是最后一行后面的两个
里面的传输是这样的过程, 看实现也就比较容易了. Django文档里面有这么一段:
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from .forms import UploadFileForm
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
form = UploadFileForm()
return render_to_response('upload.html', {'form': form})
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
最关键的一句是
handle_uploaded_file(request.FILES['file'])
request.FILES
是一个字典:
A view handling this form will receive the file data in request.FILES, which is a dictionary containing a key for each FileField (or ImageField, or other FileField subclass) in the form
里面的key就是上面name字段, 而它的value是一个
, 我们可以通过
属性来获取上传的filename~
剩下我们所需要做的就是把对应的内容写入文件即可(见
handle_uploaded_file
), 另外需要注意下目录权限以及路径~
Django里面的测试还是相当方便的, 上传文件也不例外, 看下
Submitting files is a special case. To POST a file, you need only provide the file field name as a key, and a file handle to the file you wish to upload as a value.
简单的例子:
c = Client()
with open('wishlist.doc') as fp:
c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 django 上传文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信