public async Task Upload(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("请选择文件!");
var fileSizeLimit = 10000000; //文件大小限制为10MB
var allowedExtensions = new[] { ".jpg", ".png", ".doc", ".pdf" }; //允许上传的扩展名
var extension = Path.GetExtension(file.FileName);
if (file.Length > fileSizeLimit)
return BadRequest($"文件大小不能超过{fileSizeLimit / 1024 / 1024}MB");
if (!allowedExtensions.Contains(extension.ToLower()))
return BadRequest("不支持此文件类型");
//保存文件并返回结果
}
services.Configure(options =>
{
options.ModelValidatorProviders.Insert(0, new FileValidationProvider());
});
然后,新建FileValidationProvider.cs文件,实现自定义验证器:
public class FileValidationProvider : IModelValidatorProvider
{
public void CreateValidators(ModelValidatorProviderContext context)
{
foreach (var modelMetadata in context.Results.Select(r => r.Metadata).Where(m => m.ModelType == typeof(IFormFile)))
{
context.Results.Add(new ValidatorItem {
Validator = new FileSizeValidator(modelMetadata),
IsReusable = true });
context.Results.Add(new ValidatorItem {
Validator = new FileTypeValidator(modelMetadata),
IsReusable = true });
}
}
private class ValidatorItem : ValidatorItemBase
{
public ValidatorItem() : base(string.Empty) { }
}
private class FileSizeValidator : AbstractValidator
{
private readonly int _maxSizeInBytes;
public FileSizeValidator(ModelMetadata metadata)
: base(metadata, new HttpContextAccessor())
{
_maxSizeInBytes = 10 * 1024 * 1024; //文件大小限制为10MB
}
public override string ErrorMessage { get; set; } = "文件大小不能超过10MB";
public override bool IsValid(IFormFile value)
{
if (value == null || value.Length == 0)
return true;
return value.Length <= _maxSizeInBytes;
}
}
private class FileTypeValidator : AbstractValidator
{
private readonly string[] _allowedExtensions;
public FileTypeValidator(ModelMetadata metadata)
: base