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()的时候,文件对象会保存在相应的FileField的upload_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})