在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'
代码说明
- ALLOWED_TYPES:定义你需要支持的视频格式,比如添加
'flv'或'wmv'只需把格式名加入列表。 - 文件签名验证:
- 无需额外依赖,速度极快,适合快速过滤明显无效的文件。
- 你可以根据需要补充更多格式的签名(网上能查到各种文件的魔数)。
- 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
相关产品推荐
相关产品推荐

