当前位置: 主页 > 日志 > Django >

[转]django 如何实现文件上传

 原文地址:http://plq168.blog.163.com/blog/static/531014622010922103559498/

 

有如下一个form:

from django import forms

class UploadFileForm(forms.Form):

  title = forms.CharField(max_length=50)

  file = forms.FileField()

 

处理这个form的视图收到了在request.FILES中的文件数据。从上述form来的数据可能通过request.FILES['file']来存取。特别注意的是,只有当request方法是POST,且发送request的<form>有属性enctype="multipart/form-data"时,request.FILES中包含文件数据,否则request.FILES为空。

 

以下视图函数:

from django.http import HttpResponseRedirect

from django.shortcuts import render_to_response

 

from somewhere import handle_uploader_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')

  else:

     form = UploadFileForm()

  return render_to_response('upload.html', {'form': form})

 

必须要将request.FILES传给form的构造函数,才能将文件数据绑定到form.

 

处理上传文件

字典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():上传文件的文件大小(字节)

 

由上面的说明可以写出handle_uploaded_file函数

def handle_uploaded_file(f):

  destination = open('some/file/name.txt', 'wb+')

  for chunk in f.chunks():

    destination.write(chunk)

  destination.close()

 

上传文件保存的位置

保存上传文件前,数据需要存放在某个位置。默认时,当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。意味着保存文件只有一次从内存读取,一次写磁盘。

但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。

 

改变upload handler的行为

三个设置控制django文件上传的行为:

FILE_UPLOAD_MAX_MEMORY_SIZE:直接读入内存的最大上传文件大小(字节数)。当大于此值时,文件存放到磁盘。默认2.5M字节

FILE_UPLOAD_TEMP_DIR

FILE_UPLOAD_PERMISSIONS:权限

 

FILE_UPLOAD_HANDLERS

上传文件真正的处理器。修改此项设置可以完成自定义django上传文件的过程。

默认是:

("django.core.files.uploadhandler.MemoryFileUploadHandler",

 "django.core.files.uploadhandler.TemporaryFileUploadHandler",)

先尝试装入内存,如不行就存入到临时文件。

[日志信息]

该日志于 2011-05-01 22:51 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “[转]django 如何实现文件上传” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部