Отправка нескольких файлов на контроллер ASP.NET, принимающий ICollection‹IFormFile›

В моем бэкэнде ASP.NET Core у меня есть функция контроллера, которая выглядит так:

[HttpPost]
[Route("documents/upload")]
public async Task<IActionResult> UploadFile(ICollection<IFormFile> files)
{
   ...
}

В моем интерфейсе я вызываю функцию следующим образом:

var postSettings = {
    method: 'POST',
    credentials: 'include',
    mode: 'cors'
}
uploadDocuments( files ) {
    var data = new FormData();
    data.append('files', files);   
    postSettings.body = data;

    return fetch(endPoint + '/documents/upload', postSettings);
}

Если "файлы" - это один файл - не массив с одним файлом, а один объект File - UploadFile вызывается с ICollection<IFormFile>, содержащим один файл.

Если «файлы» — это список файлов, либо FileList, либо массив объектов File, UploadFile вызывается с пустым ICollection<IFormFile>.

Как отправить список файлов таким образом, чтобы их можно было проанализировать как ICollection<IFormFile>?


person Simon Christiansen    schedule 17.04.2017    source источник


Ответы (1)


Ссылка Загрузка нескольких файлов одновременно — с Получить

uploadDocuments(endPoint, files) {
    var postSettings = {
        method: 'POST',
        credentials: 'include',
        mode: 'cors'
    };
    var data = new FormData();
    if(files.length > 0) {
        for(var x = 0; x < files.length; x++) {
            // the name has to be 'files' so that .NET could properly bind it
            data.append('files', files.item(x));    
        }
    } 
    postSettings.body = data;

    return fetch(endPoint + '/documents/upload', postSettings);
}

Ссылка Загрузка небольших файлов с привязкой модели

При загрузке файлов с использованием привязки модели и интерфейса IFormFile метод действия может принимать либо один IFormFile, либо IEnumerable<IFormFile> (или List<IFormFile>), представляющий несколько файлов. Следующий пример перебирает один или несколько загруженных файлов, сохраняет их в локальной файловой системе и возвращает общее количество и размер загруженных файлов.

[HttpPost]
[Route("documents/upload")]
public async Task<IActionResult> Post(List<IFormFile> files)
{
    long size = files.Sum(f => f.Length);

    // full path to file in temp location
    var filePath = Path.GetTempFileName();

    foreach (var formFile in files)
    {
        if (formFile.Length > 0)
        {
            using (var stream = new FileStream(filePath, FileMode.Create))
            {
                await formFile.CopyToAsync(stream);
            }
        }
    }

    // process uploaded files
    // Don't rely on or trust the FileName property without validation.

    return Ok(new { count = files.Count, size, filePath});
}
person Nkosi    schedule 20.04.2017