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错误。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战