首页 > 其他分享 >Django限制用户上传文件格式与大小

Django限制用户上传文件格式与大小

时间:2022-11-08 00:22:43浏览次数:132  
标签:max upload Django content 文件格式 file 上传 size

https://blog.csdn.net/weixin_42134789/article/details/100012339

Django模型中自带的ImageField和FileField字段并不会也不能限制用户上传的图片或文件的格式和大小,这给Web APP开发带来了很大的安全隐患。当然你可以通过自定义form类中的clean的方法来添加对image或file字段进行验证,从而限制上传文件格式和大小,然而这并不是最佳处理方法,因为这意味者每次你的模型里包含了图片或文件字段,你都要自定义forms类,并添加clean方法,从而造成大量代码重复。一个处理该问题的最佳方式是扩展Django的FileFiled字段,在创建模型时直接设置可以接受的文件类型,并限定可以上传的文件的最大尺寸。本文教你如何扩展Django的FileField字段,并展示如何在模型中使用它,从而以最佳方式限制用户上传文件的格式与大小。

 

扩展FileField字段

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

  1.   from django.db.models import FileField
  2.   from django.forms import forms
  3.   from django.template.defaultfilters import filesizeformat
  4.    
  5.    
  6.   class RestrictedFileField(FileField):
  7.   """ max_upload_size:
  8.   2.5MB - 2621440
  9.   5MB - 5242880
  10.   10MB - 10485760
  11.   20MB - 20971520
  12.   50MB - 5242880
  13.   100MB 104857600
  14.   250MB - 214958080
  15.   500MB - 429916160
  16.   """
  17.   def __init__(self, *args, **kwargs):
  18.   self.content_types = kwargs.pop("content_types", [])
  19.   self.max_upload_size = kwargs.pop("max_upload_size", [])
  20.    
  21.   super().__init__(*args, **kwargs)
  22.    
  23.   def clean(self, *args, **kwargs):
  24.   data = super().clean(*args, **kwargs)
  25.   file = data.file
  26.    
  27.   try:
  28.   content_type = file.content_type
  29.   if content_type in self.content_types:
  30.   if file.size > self.max_upload_size:
  31.   raise forms.ValidationError('Please keep filesize under {}. Current filesize {}'
  32.   .format(filesizeformat(self.max_upload_size), filesizeformat(file.size)))
  33.   else:
  34.   raise forms.ValidationError('This file type is not allowed.')
  35.   except AttributeError:
  36.   pass
  37.   return data

如何使用扩展后的RestrictedFileField

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

  1.   from django.db import models
  2.   from .fields import RestrictedFileField
  3.    
  4.   class File(models.Model):
  5.   file = RestrictedFileField(upload_to=user_directory_path, max_length=100,
  6.   content_types=['application/pdf', 'application/excel', 'application/msword',
  7.   'text/plain', 'text/csv', 'application/zip',
  8.   max_upload_size=5242880,)
  9.    
  10.    
  11.    
  12.   class Image(models.Model):
  13.   file = RestrictedFileField(upload_to=user_directory_path, max_length=100,
  14.   content_types=['image/jpeg', 'image/gif', 'image/gif', 'image/bmp', 'image/tiff'],
  15.   max_upload_size=5242880,)

 

注意:

用户上传文件还要考虑其它安全因素,比如不同用户上传了文件名相同的文件怎么办?用户上传文件的应该放在哪里比较好?更多内容见Django自定义图片和文件上传路径(upload_to)的2种方式

 

标签:max,upload,Django,content,文件格式,file,上传,size
From: https://www.cnblogs.com/ldx-wsj/p/16867965.html

相关文章

  • django的auth模块学习
    auth1.我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统。此时我们需要实现包括用户注册、用户登录、用户认证、注销、修改密码等功能,这还真是个麻烦的事情......
  • django图片显示问题
        第二种是可以的......
  • springboot 上传文件设置文件大小限制
     报错内容:org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateExce......
  • 如何实现大文件上传、断点续传、切片上传
    背景文件上传是个非常普遍的场景,特别是在一些资源管理相关的业务中(比如网盘)。在文件比较大的时候,普通的上传方式可能会遇到以下四个问题。文件上传超时:原因是前端请求......
  • AI云边端EasyCVR平台支持国标级联时上传设备的自定义经纬度
    EasyCVR平台支持设备上传经纬度,并能在电子地图上显示设备的地理位置。设备可以通过4G、5G等网络实时向平台传输位置信息,结合GIS电子地图,能实现视频监控的空间化、立体化布......
  • CSRF和token以及用django实现
    csrfCSRF(Cross-SiteRequestForgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在未授权的情况下执......
  • django-environ学习
    官方说明:https://django-environ.readthedocs.io/en/latest/index.htmlinstallpipinstalldjango-environquickstartimportenvironimportosenv=environ.Env(......
  • linux使用命令行从某度网盘上传/下载数据
    1、linux系统中已安装有python环境,安装bypy库和requests库安装方法如下:pipinstallrequests-ihttps://pypi.doubanio.com/simplepipinstallbypy-ihttps://pypi.do......
  • 使用 Django 发送邮件, 以及遇到的一些问题
    尝试了下使用Django发送邮件在setting.py中的配置#mailconfigEMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend'EMAIL_HOST='smtp.qq.com'EM......
  • js获取上传音视频的时长
    js获取上传音视频的时长 获取上传视频路径,将该路径放入video标签,获取视频时长 方式一:隐藏一个音频标签,播放获取。<videostyle="display:none;"controls="controls......