翼度科技»论坛 编程开发 .net 查看内容

.NET Core WebAPI 基础 文件上传

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
  昨天分享了一个在WebApi中如何接收参数的文章 传送门,然后有新人小伙伴就问了,那文件上传呢,这个怎么弄,借此我写了一个小demo,分享给大家。
  通常来说,上传文件,我们是使用POST,还是老规矩先上代码:
txt文件

这是需要上传的txt文件。

指定文件参数名

代码
  1. [HttpPost("UploaFile")]
  2. public async Task<Dictionary<string, string>> UploadFileAsync(IEnumerable<IFormFile> files)
  3. {
  4.     var fileStream = files.FirstOrDefault()?.OpenReadStream();
  5.     var fileContent = new StringBuilder();
  6.     if (fileStream != null)
  7.     {
  8.         using var reader = new StreamReader(fileStream!);
  9.         while (reader.Peek() >= 0)
  10.         {
  11.             fileContent.AppendLine(await reader.ReadLineAsync());
  12.         }
  13.     }
  14.     var result = new Dictionary<string, string>()
  15.     {
  16.         ["fileContent"] = fileContent.ToString()
  17.     };
  18.     return result;
  19. }
复制代码
调用示例


  这里有一个需要注意的地方,就是上传文件的参数名,需要跟接口的入参名一致,也就是 files,我们使用的类型为 IEnumerable,主要是 IFormFile 这个,因为我们上传的文件可能不止一个,所以这里使用了集合,要是不喜欢 IEnumerable,换成 List 也是可以的;
不指定文件参数名

  而在实际开发中,我们可能会碰到前端不配合,或者参数名改来改去,我们后端又不想频繁更改,那怎么办呢,此时我们可以使用以下的方法,不过我个人不太建议,还是好好沟通的好,不然别人看到你的接口文档,例如swagger,都不知道你这个接口是上传文件的。
代码
  1. [HttpPost("UploaFile2")]
  2. public async Task<Dictionary<string, string>> UploadFile2Async()
  3. {            
  4.     var fileStream = HttpContext.Request.Form.Files.FirstOrDefault()?.OpenReadStream();
  5.     var fileContent = new StringBuilder();
  6.     if (fileStream != null)
  7.     {
  8.         using var reader = new StreamReader(fileStream!);
  9.         while (reader.Peek() >= 0)
  10.         {
  11.             fileContent.AppendLine(await reader.ReadLineAsync());
  12.         }
  13.     }
  14.     var result = new Dictionary<string, string>()
  15.     {
  16.         ["fileContent"] = fileContent.ToString()
  17.     };
  18.     return result;
  19. }
复制代码
示例


   可以看到,结果是一样的。
混合

  而同样是一个POST请求,自然是可以通过url,route,from这些传参啦!
代码
  1. [HttpPost("{method}/{value}/UploaFile")]
  2. public async Task<Dictionary<string, object>> UploadFileAsync(
  3.     [FromRoute] Parameter route,
  4.     [FromQuery] Parameter query,
  5.     [FromForm] Parameter form,
  6.     IEnumerable<IFormFile> files)
  7. {
  8.     var fileStream = files.FirstOrDefault()?.OpenReadStream();
  9.     var fileContent = new StringBuilder();
  10.     if (fileStream != null)
  11.     {
  12.         using var reader = new StreamReader(fileStream!);
  13.         while (reader.Peek() >= 0)
  14.         {
  15.             fileContent.AppendLine(await reader.ReadLineAsync());
  16.         }
  17.     }
  18.     var result = new Dictionary<string, object>()
  19.     {
  20.         ["route"] = route,
  21.         ["query"] = query,
  22.         ["form"] = form,
  23.         ["fileContent"] = fileContent.ToString()
  24.     };
  25.     return result;
  26. }
复制代码
示例


 关于文件上传,在微软的官网中也有对应的文档,感兴趣的小伙伴可以去看看,传送门,感谢各位的阅读,有任何问题欢迎评论区留言!

来源:https://www.cnblogs.com/ysmc/archive/2023/08/30/17666170.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具