通过HTTP提交的文件以字典的形式保存于request.FILES
中(与request.POST
不同)
- 一个简单的文件上传
- form
# forms.py from django import forms class UploadFileForm(forms.Form): title = forms.CharField(max_length=50) file = forms.FielField()
- view
当请求方法为POST,并且<form>标签中包含enctype="multipart/form-data"
时,request.FIELS
中才能保存数据
上边的视图函数,可以用于处理绝大多数的表单提交# views.py from django.http import HttpResponseRedirect from django.shortcuts import render from .forms import UploadFileForm def handle_uploaded_file(f): with open('some/file/name.txt', 'wb+') as destination: # 使用chunks()方法而不是read()的原因在于防止内存溢出 for chunk in f.chunks(): destination.write(chunk) def upload_file(request): if request.method == POST: # 此处需要将request.FILES也显式地传入 form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): # file是HTML表单中提交文件的name handle_upload_file(request.FILES['file']) return HttpResponseRedirect('/success/url/') else: form = UploadFileForm() return render(request, 'upload.html', {'form': form})
- form
- 由数据模型生成的表单
在数据模型中定义的FileFiled
中的upload_to
属性指定了保存位置(根目录由settings.py
中的MEDIA_ROOT
指定);这样在表单通过is_valid()
检查后可以直接进行save()
,而不需要自己再定义一个保存函数 - 上传多分文件
- File class
File类对象的属性和方法- name
- size
- file
- mode:read/write mode
- open(mode=None)
- __ iter__()
- chunks(chunk_size=None):迭代文件,chunk_size默认为64KB
- multiple_chunks(chunk_size=None):当文件大到需要分开传送时返回True
- close()
- ImageFile class
- width
- height