from django.conf import settings
from django.urls import re_path
from django.views.static import serve
if settings.DEBUG:
urlpatterns += [re_path(r'^media/(?P<path>.*)$', serve,
{'document_rot': settings.MEDIA_ROOT})]
# views.py
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
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})
一个处理file的示例
def handle_upload_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
不要直接读(read()),而是使用chunks()来确保过大的文件不会溢出内存。
2、用模型处理上传文件
如果你想要用一个模型和FileField来保存文件,使用ModelForm会让过程更加轻松。
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():
form.save()
return HttpResponseRedirect('/success/url/')
else:
form = ModelFormWithFileField()
return render(request, 'upload.html', {'form': form})
如果你想要手动编写一个模型,那你可以这样
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
from .models import ModelWithFileField
def upload_file(request):
if request.method == 'POST':
form = UploadFielForm(request.POST, request,.FILES)
if form.is_valid():
instance = ModelWithFileField(file_field=requst.FILES['file'])
instance.save()
return HttpResponseRedirect('/success/url')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
对了,保存的时候可以调用‘upload_to’字段,指定保存的路径。
3、上传多个文件
使用表格字段(form field)的方式来上传多个文件,需要设置
# forms.py
from django import forms
class FileFieldForm(forms.Form):
file_field = forms.FileField(widget=forms.ClaerbleFileInput(atts={'multiple': True}))
然后覆盖FormView子类的post方法来处理多个文件上传
from django.views.generic.edit import FormView
from .forms import FileFieldForm
class FileFieldView(FormView):
form_class = FileFieldForm
template_name = 'upload.html'
success_url = '....'
def post(self, request, *args, **kwargs):
form_class = self.get_form_class()
form = self.get_form(form_class)
files = request.FILES.getlist(file_field'')
if form.is_valid():
for i in files:
...
return self.form_valid(form)
else:
return self.form_invalid(form)