Django 文件上传

当Django在处理文件上传的时候,文件数据被保存在request.FILES中。

注意:request.FILES只有在请求方法为POST,并且发送请求的<form>表单中拥有enctype="multipart/form-data"属性时,才会包含数据。否则request.FILES为空。 

文件上传示例:

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.views import View
from .forms import UploadFileForm

# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file

class UploadFile(View):
    def post(request):
        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这是文件数据绑定到表单的方法。

这里是一个普遍的方法,可能你会采用它来处理上传文件:

def handle_uploaded_file(f):
    with open('some/file/name.txt', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

遍历UploadedFile.chunks(),而不是使用read(),能确保大文件并不会占用系统过多的内存。

 

如果你在Model上使用FileField保存文件,使用ModelForm可以让这个操作更加容易。调用form.save()的时候,文件对象会保存在相应的FileFieldupload_to参数指定的地方。

from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import ModelFormWithFileField

def upload_file(request):
    if request.method == 'POST':
        form = ModelFormWithFileField(request.POST, request.FILES)
        if form.is_valid():
            # file is saved
            form.save()
            return HttpResponseRedirect('/success/url/')
    else:
        form = ModelFormWithFileField()
    return render(request, 'upload.html', {'form': form})

 

posted @ 2017-06-01 22:55  Vincen_shen  阅读(398)  评论(0)    收藏  举报