Tags : Ajax  apache  awk  besttrace  bootstrap  CDN  Django  git 

常见问题

文件上传、存储

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

 

 



标签 :  文件上传 上一篇     下一篇