asp.net core webapi文件上传功能的实现_实用技巧

来源:脚本之家  责任编辑:小易  

最近开发一个新项目,使用了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-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)

后记

回想起当年做WebService的时候,上传文件写的
多平台上传
,感触颇多,以前是转码到base64,通过string发送,现在是直接类型识别...

到此这篇关于asp.net core webapi文件上传的文章就介绍到这了,更多相关asp.net core webapi文件上传内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

您可能感兴趣的文章:ASP.NET Core文件上传与下载实例(多种上传方式)asp.net core分块上传文件示例asp.net core mvc实现文件上传实例asp.net core实现文件上传功能

  • 本文相关:
  • asp.net mvc4之js css文件合并功能(3)
  • asp.net中用js取checkboxlist中值的方法实例
  • datagrid同时具有分页和排序功能及注意点
  • asp.net设计网络硬盘之两重要类代码
  • asp.net 数据绑定 使用eval 时候报 字符文本中的字符太多 问题的
  • asp.net 2.0 中的创建母版页
  • 一天精通asp.net的学习经验小结
  • asp.net获取真正的客户端ip地址的6种方法
  • mvc实现图片验证码功能
  • abp(现代asp.net样板开发框架)系列之二、abp入门教程详解
  • net core webapi 怎么样
  • net core webapi 怎么将一个局部视图
  • .net core有没有类似于webapi.selfhost的nuget包?
  • webapi 发布后带有多语言文件夹de es
  • .net core中如何在执行action前植入一个webapi过滤...
  • 我使用 .net core webapi 怎么获取图片并存到本地...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core文件上传与下载实例(多种上传方式)asp.net core分块上传文件示例asp.net core mvc实现文件上传实例asp.net core实现文件上传功能asp.net mvc4之js css文件合并功能(3)asp.net中用js取checkboxlist中值的方法实例datagrid同时具有分页和排序功能及注意点asp.net设计网络硬盘之两重要类代码asp.net 数据绑定 使用eval 时候报 字符文本中的字符太多 问题的asp.net 2.0 中的创建母版页一天精通asp.net的学习经验小结asp.net获取真正的客户端ip地址的6种方法mvc实现图片验证码功能abp(现代asp.net样板开发框架)系列之二、abp入门教程详解未将对象引用设置到对象的实例 (java正则表达式 pattern和matcheasp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net对路径"xxxxx"asp.net汉字转拼音和获取汉字首字asp.net网站优化系列之数据库的优化措施与asp datatable添加列和行的三种方法asp.net jscript 一句话木马自己常用到的自定义公共类(已测试通过)使用母版页时内容页如何使用css和javascrasp.net下无法循环绑定投票的标题和选项的.net 反序题目的详细解答.net 资源文件resx、resources详细说明asp.net实现图书管理系统的步骤详解asp.net点击 查看更多 实现无刷新加载的实
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved