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

如何在Django中限制文件模型仅允许上传指定扩展名的文件?

在Django中限制文件上传扩展名的实现方法

嘿,我来帮你搞定这个问题!要在Django里只允许用户上传指定扩展名的视频文件(比如mp4、mpg),我们可以从模型层验证、表单验证这几个层面入手,既保证安全性又符合Django的最佳实践。结合你给出的代码,具体实现方法如下:

方法一:使用Django内置的FileExtensionValidator(最简单直接)

Django自带了FileExtensionValidator验证器,可以直接在FileField上指定允许的扩展名,这是最快捷的方式。

修改你的models.py:

from django.db import models
from django.core.validators import FileExtensionValidator  # 导入验证器

class Video(models.Model):
    my_video = models.FileField(
        upload_to='uploaded_video/',
        # 指定允许的扩展名,可根据需要添加更多(比如mov、avi)
        validators=[FileExtensionValidator(allowed_extensions=['mp4', 'mpg'])]
    )
    title = models.CharField(max_length=180)
    date = models.DateTimeField(auto_now=True)

这个验证器会自动检查文件的扩展名(不区分大小写),如果用户上传了不符合要求的文件,在表单验证时会抛出错误。

方法二:自定义验证器(更严谨,检查文件实际类型)

有时候用户可能会修改文件扩展名绕过验证,这时候我们可以自定义验证器,检查文件的MIME类型(也就是文件的实际内容类型),进一步提升安全性。

步骤1:编写自定义验证函数

在models.py中添加以下代码:

from django.core.exceptions import ValidationError

def validate_video_content_type(value):
    # 定义允许的视频MIME类型
    allowed_content_types = [
        'video/mp4',
        'video/mpeg',  # 对应mpg格式
        'video/quicktime',  # 对应mov格式
        'video/x-msvideo'  # 对应avi格式
    ]
    # 检查文件的content_type
    if value.content_type not in allowed_content_types:
        raise ValidationError("仅支持上传MP4、MPG、MOV、AVI格式的视频文件!")
    # 可选:添加文件大小限制(比如限制50MB以内)
    max_size = 50 * 1024 * 1024  # 50MB
    if value.size > max_size:
        raise ValidationError(f"文件大小不能超过{max_size//(1024*1024)}MB!")

步骤2:在模型中使用自定义验证器

修改my_video字段:

class Video(models.Model):
    my_video = models.FileField(
        upload_to='uploaded_video/',
        # 可以同时使用内置验证器和自定义验证器
        validators=[FileExtensionValidator(allowed_extensions=['mp4', 'mpg']), validate_video_content_type]
    )
    title = models.CharField(max_length=180)
    date = models.DateTimeField(auto_now=True)

优化你的视图代码(避免重复保存文件)

你当前的视图代码里,先手动用FileSystemStorage保存了一次文件,然后又调用form.save(),这会导致文件被保存两次,而且跳过了表单的验证逻辑。我们可以直接通过ModelForm来处理上传,让验证自动生效。

步骤1:确保你有对应的ModelForm(新建forms.py)

from django import forms
from .models import Video

class VideoForm(forms.ModelForm):
    class Meta:
        model = Video
        fields = ['title', 'my_video']  # 对应模型中的字段

步骤2:修改views.py中的上传视图

from django.shortcuts import render, redirect
from .forms import VideoForm

def upload(request):
    if request.method == 'POST':
        # 直接用请求数据实例化表单
        form = VideoForm(request.POST, request.FILES)
        # 调用is_valid()会自动触发模型中的所有验证器
        if form.is_valid():
            form.save()  # 只保存一次文件
            return redirect('upload_success')  # 替换成你的成功页面URL
    else:
        form = VideoForm()
    return render(request, 'upload.html', {'form': form})

在模板中显示错误信息

最后,在你的上传模板(比如upload.html)里,可以添加错误提示,让用户知道哪里出了问题:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    {% if form.errors %}
        <div style="color: red;">
            {% for field in form %}
                {% for error in field.errors %}
                    <p>{{ error }}</p>
                {% endfor %}
            {% endfor %}
        </div>
    {% endif %}
    <button type="submit">上传视频</button>
</form>

这样,当用户上传不符合要求的文件时,页面会显示对应的错误提示,同时文件不会被保存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:33:13