Farseer

导航

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错误。



posted on 2023-08-03 21:36  佛西亚  阅读(42)  评论(0编辑  收藏  举报