千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Django限制用户上传文件格式与大小的优异处理方式是什么?

Django限制用户上传文件格式与大小的优异处理方式是什么?

来源:千锋教育
发布人:xqq
时间: 2023-10-11 18:05:04 1697018704

一、Django限制用户上传文件格式与大小的优异处理方式

一个处理该问题的优异方式是扩展Django的FileFiled字段,在创建模型时直接设置可以接受的文件类型,并限定可以上传的文件的最大尺寸。本文教你如何扩展Django的FileField字段,并展示如何在模型中使用它,从而以优异方式限制用户上传文件的格式与大小。

扩展FileField字段

首先在你APP文件夹内新建fields.py, 并添加如下代码(来自stackoverflow)。新扩展的FileField叫RestrictedFileField,继承了FileField类,并包含了额外的两个可选参数: 可接受的内容类型content_types和max_upload_size最大上传尺寸(比如5242880=5MB)。

from django.db.models import FileField

from django.forms import forms

from django.template.defaultfilters import filesizeformat

class RestrictedFileField(FileField):

    “”” max_upload_size:

            2.5MB – 2621440

            5MB – 5242880

            10MB – 10485760

            20MB – 20971520

            50MB – 5242880

            100MB 104857600

            250MB – 214958080

            500MB – 429916160

    “””

def __init__(self, *args, **kwargs):

        self.content_types = kwargs.pop(“content_types”, [])

        self.max_upload_size = kwargs.pop(“max_upload_size”, [])

        super().__init__(*args, **kwargs)

    def clean(self, *args, **kwargs):

        data = super().clean(*args, **kwargs)

        file = data.file

        try:

            content_type = file.content_type

            if content_type in self.content_types:

                if file.size > self.max_upload_size:

                    raise forms.ValidationError(‘Please keep filesize under {}. Current filesize {}’

.format(filesizeformat(self.max_upload_size), filesizeformat(file.size)))

            else:

                raise forms.ValidationError(‘This file type is not allowed.’)

        except AttributeError:

            pass

        return data

如何使用扩展后的RestrictedFileField

首先你要从创建的fields.py里导入RestrictedFileField,然后在模型中按如下代码使用它。该字段可以用于文件,也可以用于图片。与ImageField和FileField相比,它多了content_types和max_upload_size选项,从此你再也不用担心用户上传文件时为所欲为啦。 这个字段是如此有用,说不定Django某一天会把它变成默认字段哦。小编我期待有那一天的到来。

from django.db import models

from .fields import RestrictedFileField

class File(models.Model):

    file = RestrictedFileField(upload_to=user_directory_path, max_length=100,

content_types=[‘application/pdf’, ‘application/excel’, ‘application/msword’,

‘text/plain’, ‘text/csv’, ‘application/zip’,

max_upload_size=5242880,)

class Image(models.Model):

    file = RestrictedFileField(upload_to=user_directory_path, max_length=100,

content_types=[‘image/jpeg’, ‘image/gif’, ‘image/gif’, ‘image/bmp’, ‘image/tiff’],

max_upload_size=5242880,)

延伸阅读:

二、data是什么

data 用来保存实际变量的地址。

data 中的内容会根据实际情况变化,因为 golang 在函数传参和赋值时是 值传递 的,所以:

1.  如果实际类型是一个值,那么 interface 会保存这个值的一份拷贝。interface 会在堆上为这个值分配一块内存,然后 data 指向它。

2.  如果实际类型是一个指针,那么 interface 会保存这个指针的一份拷贝。由于 data 的长度恰好能保存这个指针的内容,所以 data 中存储的就是指针的值。它和实际数据指向的是同一个变量。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT