ASP.NET Core 7中如何判定并验证上传视频的分辨率?
验证上传视频分辨率的实现方案(ASP.NET Core 7)
要实现视频分辨率验证,核心是解析视频元数据获取分辨率,再结合ASP.NET Core的模型验证机制完成校验,具体步骤如下:
1. 引入视频元数据解析库
直接解析视频文件需要处理复杂的编码格式,推荐用成熟的第三方库简化操作,比如FFmpegCore:
- 通过NuGet安装:
Install-Package FFmpegCore - 需确保项目中存在FFmpeg可执行文件(可从FFmpeg官方渠道下载对应平台版本,放到项目根目录并设置"复制到输出目录"为"始终复制")
2. 实现自定义验证属性
创建继承自ValidationAttribute的自定义验证类,用于校验视频分辨率:
using FFmpegCore; using Microsoft.AspNetCore.Http; using System.ComponentModel.DataAnnotations; using System.Linq; public class VideoResolutionAttribute : ValidationAttribute { private readonly int _requiredWidth; private readonly int _requiredHeight; public VideoResolutionAttribute(int requiredWidth, int requiredHeight) { _requiredWidth = requiredWidth; _requiredHeight = requiredHeight; ErrorMessage = $"视频分辨率必须为{_requiredWidth}×{_requiredHeight}"; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value is not IFormFile file || file.Length == 0) { return new ValidationResult("请上传有效的视频文件"); } try { using var stream = file.OpenReadStream(); var mediaInfo = FFmpeg.GetMediaInfo(stream); var videoStream = mediaInfo.VideoStreams.FirstOrDefault(); if (videoStream == null) { return new ValidationResult("上传的文件不是视频"); } if (videoStream.Width != _requiredWidth || videoStream.Height != _requiredHeight) { return new ValidationResult(ErrorMessage); } return ValidationResult.Success; } catch (Exception ex) { return new ValidationResult($"解析视频信息失败:{ex.Message}"); } } }
3. 给请求模型添加验证属性
修改UploadMediaRequest模型,将自定义验证属性加到Media字段上:
using Microsoft.AspNetCore.Http; using System.ComponentModel.DataAnnotations; public class UploadMediaRequest { [Required] [VideoResolution(800, 468)] // 指定要求的分辨率:800×468 public IFormFile Media { get; set; } }
4. 控制器中接收并验证请求
在控制器的Action中直接使用模型绑定,ASP.NET Core会自动触发验证:
using Microsoft.AspNetCore.Mvc; [ApiController] [Route("api/media")] public class MediaController : ControllerBase { [HttpPost("upload")] public IActionResult UploadVideo([FromForm] UploadMediaRequest request) { if (!ModelState.IsValid) { return BadRequest(ModelState); } // 验证通过,执行后续上传逻辑 return Ok("视频上传成功"); } }
注意事项
- 若部署到服务器,需配置FFmpeg可执行文件路径,可通过
FFmpegOptions.SetExecutablesPath指定 - 大文件上传时,需在
Program.cs中配置请求大小限制:builder.Services.Configure<Microsoft.AspNetCore.Http.Features.FormOptions>(options => { options.MultipartBodyLengthLimit = 1073741824; // 1GB }); - 可根据需求扩展验证逻辑,比如支持多种分辨率、宽高比校验等
内容的提问来源于stack exchange,提问作者kanils_
相关产品推荐
相关产品推荐

