web-dev-qa-db-ja.com

ICollection <IFormFile>を受け入れるASP.NETコントローラーに複数のファイルを送信する

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);
}

「files」が単一のファイルである場合(1つのファイルを含む配列ではなく、単一のFileオブジェクト)、UploadFileは、単一のファイルを含むICollection<IFormFile>で呼び出されます。

「files」がFileListまたはFileオブジェクトの配列のいずれかのファイルのリストである場合、UploadFileは空のICollection<IFormFile>で呼び出されます。

ICollection<IFormFile>として解析できるようにファイルのリストを送信するにはどうすればよいですか?

7

参照 一度に複数のファイルをアップロードする-Fetchを使用

uploadDocuments(endPoint, files) {
    var postSettings = {
        method: 'POST',
        credentials: 'include',
        mode: 'cors'
    };
    var data = new FormData();
    if(files.length > 1) {
        for(var x = 0; x < files.length; x++) {
            data.append('file' + x, files.item(x));    
        }
    } else {
        data.append('files', files);   
    }
    postSettings.body = data;

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

参照 モデルバインディングを使用した小さなファイルのアップロード

モデルバインディングとIFormFileインターフェースを使用してファイルをアップロードする場合、actionメソッドは複数のファイルを表す単一のIFormFileまたはIEnumerable<IFormFile>(またはList<IFormFile>)のいずれかを受け入れることができます。次の例では、アップロードされた1つ以上のファイルをループしてローカルファイルシステムに保存し、アップロードされたファイルの総数とサイズを返します。

[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});
}
10
Nkosi