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

400-811-9990
手机站
千锋教育

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

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

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

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:成都千锋IT培训  >  技术干货  >  Django限制用户上传文件格式与大小的优异处理方式是什么?

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

来源:千锋教育
发布人:xqq
时间: 2023-10-14 21:20:53

一、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 中存储的就是指针的值。它和实际数据指向的是同一个变量。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

为什么 CIS Benchmarks 非常重要?

2023-10-14

为什么应使用 Docker?

2023-10-14

负载均衡有哪些优势?

2023-10-14

最新文章NEW

使用 XML 有哪些好处??

2023-10-14

python 在cmd 下执行脚本语句和在python shell 中的>>>下执行语句有什么区别?

2023-10-14

Fortran语言中read*,和read(*,*)的区别?

2023-10-14

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>