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>
として解析できるようにファイルのリストを送信するにはどうすればよいですか?
参照 一度に複数のファイルをアップロードする-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});
}