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

在Django中实现VIDEOBASE64File验证类,为User模型添加视频字段

实现支持指定视频格式的VideoBase64File验证类

没问题!基于你现有的PDFBase64File实现思路,咱们可以轻松打造一个支持MP4等指定视频格式的VideoBase64File验证类。核心是结合文件签名验证(轻量快速)和视频有效性校验(严格准确)来确保上传的Base64内容是合法的视频文件。

完整实现代码

import io
from rest_framework.fields import Base64FileField

class VideoBase64File(Base64FileField):
    # 自定义允许的视频格式,按需添加(比如mp4、mov、avi等)
    ALLOWED_TYPES = ['mp4', 'mov', 'avi']

    def get_file_extension(self, filename, decoded_file):
        # 从文件名提取扩展名作为备用(可选)
        ext_from_filename = filename.split('.')[-1].lower() if '.' in filename else None

        # --------------------------
        # 方式1:轻量验证——文件签名(Magic Numbers)
        # 无需额外依赖,通过文件开头字节快速识别格式
        # --------------------------
        file_header = decoded_file[:12]  # 取前12字节足够识别多数视频格式
        format_signatures = {
            'mp4': file_header.startswith(b'\x00\x00\x00\x18ftypmp4') or file_header.startswith(b'\x00\x00\x00\x1Cftypmp4'),
            'mov': file_header.startswith(b'\x00\x00\x00\x14ftypqt  ') or file_header.startswith(b'\x6D\x6F\x6F\x76'),
            'avi': file_header.startswith(b'RIFF') and file_header[8:12] == b'AVI '
        }

        for fmt, is_valid in format_signatures.items():
            if is_valid:
                return fmt

        # --------------------------
        # 方式2:严格验证——用FFmpeg确保视频可播放
        # 需要安装依赖:pip install ffmpeg-python,且服务器需安装FFmpeg
        # --------------------------
        try:
            import ffmpeg
            # 将解码后的文件写入临时内存对象
            temp_file = io.BytesIO(decoded_file)
            # 尝试解析视频元数据,失败则抛出异常
            probe_result = ffmpeg.probe(temp_file)
            
            # 从解析结果中获取视频格式
            video_format = probe_result['format']['format_name'].split(',')[0]
            if video_format in self.ALLOWED_TYPES:
                return video_format
            # 如果文件名扩展名在允许列表里,也可以返回它(可选)
            elif ext_from_filename in self.ALLOWED_TYPES:
                return ext_from_filename
        except Exception:
            # 解析失败,说明不是有效视频
            return 'non-valid'

        # 所有验证都不通过,返回无效标识
        return 'non-valid'

代码说明

  1. ALLOWED_TYPES:定义你需要支持的视频格式,比如添加'flv'或'wmv'只需把格式名加入列表。
  2. 文件签名验证:
    • 无需额外依赖,速度极快,适合快速过滤明显无效的文件。
    • 你可以根据需要补充更多格式的签名(网上能查到各种文件的魔数)。
  3. FFmpeg严格验证:
    • 确保上传的文件是真正可播放的有效视频,而不是仅改了扩展名的垃圾文件。
    • 注意:服务器需要先安装FFmpeg,然后通过pip install ffmpeg-python安装Python绑定库。

使用示例

在你的User模型序列化器中,把视频字段指定为这个验证类即可:

from rest_framework import serializers
from .models import User
from .fields import VideoBase64File  # 假设你把VideoBase64File存在fields.py里

class UserSerializer(serializers.ModelSerializer):
    # 替换成你的字段名,比如user_video
    user_video = VideoBase64File()

    class Meta:
        model = User
        fields = ['id', 'username', 'profile_image', 'pdf_file', 'user_video']

可选优化

  • 如果不需要严格验证,可以删掉FFmpeg相关的代码,只保留文件签名验证,减少依赖。
  • 可以自定义错误提示,比如在验证失败时抛出serializers.ValidationError,而不是只返回'non-valid'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:56:36