Django限制用户上传文件格式与大小的优异处理方式是什么?
一、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 中存储的就是指针的值。它和实际数据指向的是同一个变量。

相关推荐HOT
更多>>
有哪些不同类型的 API?
一、API的类型API 根据其架构和使用范围进行分类。1、私有 API这类 API 面向企业内部,仅用于连接企业内的系统和数据。2、公有 API 这类 API ...详情>>
2023-10-14 23:46:39
Python的优缺点有哪些?
一、Python的优点1、简单易学Python的语法简单明了,易于理解和学习,非常适合初学者。2、丰富的第三方库Python拥有丰富的第三方库,可以快速开...详情>>
2023-10-14 20:19:16
B+树查询的稳定性为什么重要?
一、B+树查询的稳定性为什么重要首先最大的优势还是磁盘IO和范围,从我个人的看法看,稳定性(每次查询必须从根走到叶子节点)这意味行为可预估...详情>>
2023-10-14 17:40:38
进程如何找到pgd页表,页表的数据结构是什么?
一、进程找到pgd页表的方法在Linux内核中,每个进程都有一个指向其PGD的指针pgd,该指针位于进程描述符结构体(task_struct)中。进程可以通过...详情>>
2023-10-14 17:24:21热门推荐
有哪些不同类型的 API?
沸区块链的工作原理是什么?
热为什么 CIS Benchmarks 非常重要?
热为什么应使用 Docker?
新负载均衡有哪些优势?
使用 XML 有哪些好处??
python 在cmd 下执行脚本语句和在python shell 中的>>>下执行语句有什么区别?
Fortran语言中read*,和read(*,*)的区别?
边缘计算与CDN的区别是什么?
Django限制用户上传文件格式与大小的优异处理方式是什么?
Python单引号与双引号区别?
为什么iOS始终不支持应用双开深度分析给你答案?
高并发、高吞吐是什么?
Python的优缺点有哪些?
技术干货






