简单文件上传
# forms.py
from django import forms
class UploadFileForm(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
只有在请求是通过POST提交且提交的<form>表单有enctype="multipart/form-data"属性的时候,request.FILES才会包含文件数据,否则的话,request.FILES是空的。
# views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_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(request, 'upload.html', {'form': form})
处理上传文件
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保存文件,当调用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})
上传数据的存储
默认情况下,如果上传的文件小于2.5兆,Django将把文件的所有内容保存到内存里。
但如果上传的文件很大,Django会把文件写入系统临时目录的临时文件里存储。