127.限制上传文件的类型
限制文件的扩展名
如果想要限制文件的扩展名,就要用到表单来限制。我们可以使用普通的Form表单也可以使用ModelForm表单,直接从模型中读取字段。示例代码如下:
上传图片
上传图片和上传普通文件一样,上传图片的时候Django会判断上传的图片的格式(除了判断后缀名,还会判断是否是可用的图片),如果不是那么,就会验证失败,我们首先来定义一个包含ImageField的模型,示例代码如下:
from django.db import models
from django.core import validators
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.CharField(max_length=100)
# 指定字段类型为FileField,就可以定义上传文件的字段,并且指定参数upload_to就可以指定上传的文件存储的文件夹
# 此处指定存储在项目文件下的files下。
# 指定了该字段之后就不用再在views.py文件中定义打开,写入,保存文件的函数了。非常简单
# thumbnail = models.FileField(upload_to="%Y%m%d", validators=[validators.FileExtensionValidator(['pdf','doc','zip'],message='文件的格式不正确')])
thumbnail = models.ImageField(upload_to='%Y/%m/%d')
如果想使用ImageField这个字段,就要首先安装Pillow库,执行pip install pillow。
因为我们要验证是否提交上来的是否是图片,所以我们就可以通过form表单来验证
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
在views.py文件中进行验证:
from django.shortcuts import render
from django.http import HttpResponse
from django.views import View
from .models import Article
from .forms import ArticleForm
def save_file(file):
with open('zjy.txt', 'wb') as fp:
for chunk in file.chunks():
fp.write(chunk)
class IndexView(View):
def get(self,request):
form = ArticleForm()
return render(request, 'uploadfile/index.html', context={'form':form})
def post(self, request):
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponse('success!')
else:
print(form.errors.get_json_data())
return HttpResponse('fail')
并且在浏览器中输入url可以进行查看上传的文件:http://127.0.0.1:8000/media/2020/02/15/AI.jpg。
始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。