asp.net Core上传文件
asp.net core后台代码
通过Request获取客户端上传的文件
[HttpPost] [Route("Upload")] public async Task<IActionResult> uploadFiles() { try { foreach (var file in Request.Form.Files.Where(p => p.Length > 0)) { string fileName = @"C:\" + file.FileName; using (var stream = System.IO.File.Create(fileName)) { await file.OpenReadStream().CopyToAsync(stream); } } return Ok(new { Result = true }); } catch (Exception ex) { return BadRequest(ex.Message); } }
也可以通过入参IFormFileCollection获取文件
[HttpPost] [Route("Upload")] public async Task<IActionResult> uploadFiles(IFormFileCollection files) { try { foreach (var file in files.Where(p => p.Length > 0)) { string fileName = @"C:\" + file.FileName; using (var stream = System.IO.File.Create(fileName)) { await file.OpenReadStream().CopyToAsync(stream); } } return Ok(new { Result = true }); } catch (Exception ex) { return BadRequest(ex.Message); } }
第二种写法在客户端调用的时候要注意,名字必须跟入参files保持一致,要不然文件上传不上来。
客户端,通过postman调用,如下
如果后台用第二种写法,这里的key必须跟入参变量名files一样,否则文件上传不上来,第二种写法key值无所谓。
客户端使用HttpClient调用
string fileName = "TestFile1.pdf"; content.Add(new StreamContent(System.IO.File.OpenRead(@"C:\Files\" + fileName)), "files", fileName); fileName = "TestFile2.pdf"; content.Add(new StreamContent(System.IO.File.OpenRead(@"C:\Files\" + fileName)), "files", fileName); var response = await client.PostAsync(url, content); Console.WriteLine(response.Content.ReadAsStringAsync().Result);
跟postman调用一样,content的add方法,第二个参数,如果后台是第二种写法,必须是入参变量名files。
再测试过程中发现一个问题,把asp.net core程序发布到iis上,当上传文件大于64k时会报500 internal server error。
这是由于文件大于64K(没有找到文档说明是这个值,可能不准确)时,会把客户端接收的文件先写入windows temp文件夹下,如果应用程序池的运行账户没有写入temp文件夹的权限,就会报500错误。