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。

始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
原文地址:https://www.cnblogs.com/guyan-2020/p/12354627.html