迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库。最先来的问题就是上传文件的问题。 POST文件的一些坑使用默认模板创建webapi的controller后,post请求,默认有 // POST api/values [HttpPost] public void Post([FromBody]string value) { } 请求使用了 对于文件上传请求,直接在这个Post函数里使用 [Produces("application/json")] [Consumes("application/json", "multipart/form-data")]//此处为新增 [Route("api/[controller]")] public class FileController : Controller 指示该controller能够接受 // POST: api/File [HttpPost] public Task<ActionResult> Post(IFormCollection files) 这里需要注意,使用的是IFormCollection。这是IForm的类型集合,实际上就是 注意,很多地方写了可以使用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,与 同时上传其他数据一般的文件上传请求,不单上传文件数据,通常还需要上传其他文件信息数据(比如文件类型,上传者等等)。修改一下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) 后记 回想起当年做WebService的时候,上传文件写的 到此这篇关于asp.net core webapi文件上传的文章就介绍到这了,更多相关asp.net core webapi文件上传内容请搜索极客世界以前的文章或继续浏览下面的相关文章希望大家以后多多支持极客世界! |
请发表评论