温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在asp.net core中使用webapi实现一个文件上传功能

发布时间:2020-12-31 15:13:41 来源:亿速云 阅读:1138 作者:Leah 栏目:开发技术

这篇文章将为大家详细讲解有关如何在asp.net core中使用webapi实现一个文件上传功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

使用默认模板创建webapi的controller后,post请求,默认有

 // POST api/values
  [HttpPost]
  public void Post([FromBody]string value)
  {
  }

请求使用了[FromBody]标记,用来指示用请求体里获得数据。

对于文件上传请求,直接在这个Post函数里使用Request.Form.Files是不行的,无法成功路由。
典型上传,需要设置前端发送的请求Content-Typemultipart/form-data,然后在控制器类加上特性修饰:

 [Produces("application/json")]
 [Consumes("application/json", "multipart/form-data")]//此处为新增
 [Route("api/[controller]")]
 public class FileController : Controller

指示该controller能够接受multipart/form-data形式的数据。对应的,修改post的代码如下:

 // POST: api/File
  [HttpPost]
  public Task<ActionResult> Post(IFormCollection files)

这里需要注意,使用的是IFormCollection。这是IForm的类型集合,实际上就是Request.Form

注意,很多地方写了可以使用IFormFile,直接写成

// POST: api/File
  [HttpPost]
  public Task<ActionResult> Post(IFormFile file)

实际测试没有办法获取到对象,file常态为null,或者是我方法不对。

然后就可以在post方法里面使用files.Files来枚举文件了,每个文件都是一个IFormFile对象,可以灵活使用FileName, Name,Length等常用属性。当然,我们也可以不带参数:

// POST: api/File
  [HttpPost]
  public Task<ActionResult> Post()

直接使用Request.Form.Files获得文件数据。

P.S. 对于IFormFile,与System.IO.File对象不同,IFormFile缺少很多方法,只提供OpenReadStream()方法,该方法返回一个stream对象。很多读文件的API都可以接受stream作为FilePath的替代。

同时上传其他数据

一般的文件上传请求,不单上传文件数据,通常还需要上传其他文件信息数据(比如文件类型,上传者等等)。修改一下post方法,改成这样:

 [HttpPost]
  public Task<ActionResult> Post([FromBody]string type,IFormCollection files)

将type都打包进请求,再次发送。发现......type是null。

MSDN说了,The reason for this rule is that the request body might be stored in a non-buffered stream that can only be read once.

所以,[FromBody]只能加一个,但是我这确实也只加了一个,有问题?很明显,那个IFormCollection也是默认通过[FromBody]解析的,所以正确的方法是不加[FromBody]了。

 [HttpPost]
  public Task<ActionResult> Post(string type,IFormCollection files)

关于如何在asp.net core中使用webapi实现一个文件上传功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI