пользовательская проверка файлов для .net core 2.0 - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь сделать пользовательскую проверку файла для моего проекта, основанного на .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; }
}

Может кто-нибудь помочь мне узнать, в чем проблема?

Заранее спасибо.

...