asp.net core webapi文件上传(转载)
2018-06-22 09:32
776 查看
原文地址:https://www.cnblogs.com/podolski/archive/2017/11/06/7795168.html
最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库。最先来的问题就是上传文件的问题。
POST文件的一些坑
使用默认模板创建webapi的controller后,post请求,默认有
// POST api/values [HttpPost] public void Post([FromBody]string value) { }请求使用了
[FromBody]标记,用来指示用请求体里获得数据。对于文件上传请求,直接在这个Post函数里使用
Request.Form.Files是不行的,无法成功路由。
典型上传,需要设置前端发送的请求
Content-Type为
multipart/form-data,然后在控制器类加上特性修饰:
[Produces("application/json")] [Consumes("application/json", "multipart/form-data")]//此处为新增 [Route("api/[controller]")] public class FileController : Controller[p]指示该controller能够接受
multipart/form-data形式的数据。对应的,修改post的代码如下:
// POST: api/File [HttpPost] public Task<ActionResult> Post(IFormCollection files)这里需要注意,使用的是IFormCollection。这是IForm的类型集合,实际上就是
Request.Form。
注意,很多地方写了可以使用IFormFile,直接写成[/p]
// 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)
后记
回想起当年做WebService的时候,上传文件写的多平台上传
,感触颇多,以前是转码到base64,通过string发送,现在是直接类型识别... 阅读更多
相关文章推荐
- asp.net core webapi文件上传
- VS2017创建 ASP.NET Core 1.1 Web项目,上传大文件时提示404
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
- File Upload using jQuery AJAX in ASP.NET Web API or Http handler (AJAX上传文件通过Web API或 http handler)
- Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
- 在ASP.NET Core Web API 项目里无法访问(wwwroot)下的文件
- 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
- ASP.NET Web Api Self Host大文件上传功能
- ASP.NET CORE Linux发布工具(文件对比 只上传差异文件;自动启停WebServer命令;上传完成自动预热WebServer)
- ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析
- Docker容器环境下ASP.NET Core Web API应用程序的调试
- 【转载】解决ASP.NET上传文件大小限制
- ASP.Net Core WebApi几种版本控制对比
- ASP.Net Core WebApi几种版本控制对比
- 在ASP.NET Core Web API上使用Swagger提供API文档
- 浅析Asp.net中的Web.config文件(转载)
- 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)
- ASP.NET中文件上传下载方法集合[转载与aspcool] (转)
- 随便说说:在ASP.NET应用程序中上传文件(转载)
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线