Собственная модель файла формы

#file #asp.net-core #iformfile

#файл #asp.net-ядро #iformfile

Вопрос:

в настоящее время я решаю проблему с загрузкой файлов — я использовал IFormFile, но теперь мне нужно добавить переменную (логическое значение) к каждому файлу — чтобы узнать, пометил ли пользователь этот файл как основной файл или дополнительный файл.

Я попытался создать свой собственный класс:

 public class MyFormFile :FormFile
    {
        public MyFormFile(Stream baseStream, long baseStreamOffset, long length, string name, string fileName) : base(baseStream, baseStreamOffset, length, name, fileName)
        {
            MainFile = true;
        }

        public bool MainFile { get;set;}
    }
 

Но когда я использую это, у меня нет файлов в модели. (Когда я использую List<IFormFile> вместо List<MyFormFile> in model, тогда это работает.

в настоящее время файлы, отправляемые из браузера, выглядят следующим образом:

Файл {Основной файл: true, имя: «Test_Result.pdf», последнее изменение: 1597833278041, последнее изменение даты: Ср. 19 авг. 2020 г. 12:34:38 GMT 0200 (летнее время Центральной Европы), webkitRelativePath: «», …}

Чего мне не хватает?

Спасибо.

Ответ №1:

Вы можете попробовать использовать модель, подобную этой:

  public class FileInputModel
    {
        public FileInputModel(){
            MainFile = true;
        }
        public IFormFile File { get; set; }
        public bool MainFile { get; set; }
    }
 

И вы можете использовать ajax для отправки данных со структурой FileInputModel в контроллер, вот демонстрация:

TestController:

 public IActionResult TestFiles(List<FileInputModel> files) {
            return View();
        }
 

Вид:

 <form method="post">
    <input id="Files" type="file" multiple/>
    <input type="button" value="submit" onclick="Submit()"/>
</form>
<script>
    function Submit() {
        var pdata = new FormData();
        var files = $("#Files").get(0).files;
        for (var i = 0; i < files.length;i  ) {
            pdata.append('files['   i   '].File', files[i]);
        }
        $.ajax({
            url: "TestFiles",
            type: "POST",
            data: pdata,
            processData: false,
            contentType: false,
            success: function (data) {
            }
        });

    }
</script>
 

Результат:
введите описание изображения здесь