You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django能否在单个方法中合并实现文件扩展名与大小双重校验

结论

完全可以通过多个if判断在同一个方法内同时完成文件扩展名、文件大小两类校验,不需要拆分多个独立校验函数,整合时只需要修正原有独立代码的逻辑缺陷、规范语法即可。


原有独立代码的问题
  • 扩展名识别逻辑有缺陷:os.path.splitext() 只会从文件名最后一个.的位置切分后缀,遇到.tar.gz、.tar.xz这类多段后缀的文件,只会拿到最后一段后缀(比如test.tar.gz会被识别为.gz),会导致合法格式校验不准
  • 存在缩进不规范的语法问题,直接运行会报错
  • 没有兼容后缀名大小写的场景,比如用户上传TEST.TAR.GZ这类大写后缀的文件会被误判为不合法

整合后的单方法校验实现
import os
from django.core.exceptions import ValidationError

def validate_file(value):
    # 第一重校验:文件大小校验
    max_allowed_size = 10 * 1024 * 1024  # 10MB,用计算式替代硬编码数值,可读性更强
    if value.size > max_allowed_size:
        raise ValidationError("The maximum file size that can be uploaded is 10MB")

    # 第二重校验:文件扩展名校验,兼容多段后缀、大小写场景
    valid_extensions = ['.tar.gz', '.tgz', '.tar', '.gz', '.tar.xz', '.zip']
    lower_filename = value.name.lower()
    is_ext_valid = any(lower_filename.endswith(ext) for ext in valid_extensions)
    if not is_ext_valid:
        raise ValidationError(u'File not supported, Please upload only .tar.gz / .tgz / .zip')

    # 所有校验通过后返回文件对象
    return value

说明
  • 两个if判断按顺序执行,你可以根据需求调整两类校验的先后顺序
  • 任意一个校验不通过,都会抛出对应的错误提示
  • 所有校验逻辑都封装在validate_file单个方法内,直接在文件上传的字段上配置这个校验函数即可使用

内容的提问来源于stack exchange,提问作者user11603936

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:06:26