.net core 2.0的自定义文件验证

时间:2018-05-15 08:32:54

标签: asp.net-core .net-core asp.net-core-mvc asp.net-core-2.0 .net-core-2.0

我正在尝试为我的项目进行自定义文件验证,该项目基于.net core 2。

我想验证文件大小和文件扩展名,以防止用户上传大文件和例如.png文件。

我搜索了很多,但找不到任何有用的东西。

这是我的文件验证类:

public class FileTypeAttribute : ValidationAttribute, IClientModelValidator
{
    private const int MaxSize = 1048576;
    private const string _DefaultErrorMessage = "Only the following file types are allowed: {0}";
    private IEnumerable<string> _ValidTypes { get; set; }

    public string ValidTypes { get; set; }

    public string ErrorMessageExtension { get; set; }

    public string ErrorMessageSize { get; set; }


    public FileTypeAttribute(string errorExtension, string errorSize, string vt)
    {
        ErrorMessageExtension = errorExtension;
        ErrorMessageSize = errorSize;
        _ValidTypes = vt.Split(',');
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        IFormFile file = value as IFormFile;
        if (file != null)
        {

            if (!_ValidTypes.Any(e => file.FileName.EndsWith(e)))
            {
                return new ValidationResult(ErrorMessageExtension);
            }
            if (file.Length > MaxSize)
            {
                return new ValidationResult(ErrorMessageSize);
            }
        }

        return ValidationResult.Success;
    }

    public void AddValidation(ClientModelValidationContext context)
    {
        MergeAttribute(context.Attributes, "data-val", "true");
        var errorMessage = FormatErrorMessage(context.ModelMetadata.GetDisplayName());
        MergeAttribute(context.Attributes, "data-val-fileextensions", ErrorMessageExtension);
        MergeAttribute(context.Attributes, "data-val-maxfilesize", ErrorMessageSize);
    }

    private bool MergeAttribute(
    IDictionary<string, string> attributes, string key, string value)
    {
        if (attributes.ContainsKey(key))
        {
            return false;
        }

        attributes.Add(key, value);
        return true;
    }
}

这是我视图中的javascript代码:

$.validator.addMethod("FileType",
        function (value, element, param) {
            for (var i = 0; i < element.files.length; i++) {
                var extension = getFileExtension(element.files[0].name);
                if ($.inArray(extension, param.validtypes) === -1) {
                    return false;
                }
            }
            return true;
        });
    $.validator.unobtrusive.adapters.add('FileType', ['validtypes'], function (options) {
        console.log("value:");

        options.rules.cannotbered = {};
        options.messages["FileType"] = options.message;
    });

    function getFileExtension(fileName) {
        if (/[.]/.exec(fileName)) {
            return /[^.]+$/.exec(fileName)[0].toLowerCase();
        }
        return null;
    }

这是我项目中的实体类代码:

public class MyEntityClass
{
    public int MyEntityClassId { get; set; }

    [FileType("invalid format", "invalid size", "jpg,png,gif")]
    public IFormFile Photo { get; set; }
}

有谁能帮助我知道问题出在哪里?

提前致谢。

0 个答案:

没有答案