• 首页
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案
目录

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

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

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

相关文章