文件上传、存储
stevezhou 2015.01.12
首先了解一下 request.FILES :
字典 request.FILES 中的每一个条目都是一个UploadFile对象。UploadFile对象有如下方法:
1、UploadFile.read():
从文件中读取全部上传数据。当上传文件过大时,可能会耗尽内存,慎用。
2、UploadFile.multiple_chunks():
如上传文件足够大,要分成多个部分读入时,返回True.默认情况,当上传文件大于2.5M时,返回True。但这一个值可以配置。
3、UploadFile.chunks():
返回一个上传文件的分块生成器。如multiple_chunks()返回True,必须在循环中使用chrunks()来代替read()。一般情况下直接使用chunks()就行。
4、UploadFile.name:上传文件的文件名
5、UplaodFile.size:上传文件的文件大小(字节)
下面贴出一些实例代码,供参考:
-------
upload.html
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<label>用户名:</label><input type="text" name="username" />
<label>文 件:</label><input type="file" name="uploadfile" />
<input type="submit" value="提交" />
</form>
------models.py
class UploadFile(models.Model):
username=models.CharField(max_length=50)
uploadfile=models.FileField(upload_to='./upload/') #指定的upload目录相对于根目录下media目录
def __unicode__(self):
return username
------views.py
方法一,自己处理上传文件对象:
def upload_file(request):
if request.method=='POST':
un=request.POST.get('username')
f=request.FILES.get('uploadfile') #'uploadfile'与提交表单中input名一致,多个文件参见getlist()
filename='/'.join('d:/upload',f.name) #存放内容的目标文件路径
with open(filename,'a+') keys:
for chunk in f.chunks(): #chunks()方法将文件切分成为块(<=2.5M)的迭代对象
keys.write(chunk)
#更新数据表信息
uf=UploadFile(username=un,uploadfile=filename)
uf.save()
return HttpResponse(filename+' OK')
return render_to_response('upload.html',{})
方法二,借用django中Form处理文件对象:
def upload_file(request):
if request.method=='POST':
uf=UploadForm(request.POST,request.FILES)
if uf.is_valid():
username=uf.cleaned_data['username']
uploadfile=uf.cleaned_data['uploadfile']
#信息存放到数据表
u=UploadFile()
u.username=username
u.uploadfile=uploadfile
u.save()
return HttpResponse('OK')
return render_to_response('upload.html',{})
另外,方法二还需要额外定义一个Form对象:
from django import forms
class UploadForm(forms.Form):
username=forms.CharField()
uploadfile=forms.FileField()
说明:方法二上传的文件会保存在 网站根目录的media文件夹下,这也是在setting中定义media静态目录的一个重要作用。
参考文章:
http://blog.donews.com/limodou/archive/2006/03/23/783974.aspx
http://www.cnblogs.com/linjiqin/p/3731751.html