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-Type为multipart/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发送,现在是直接类型识别...
BUT
他喵的还在传文件啊,原地踏步啊,三年了难受!
asp.net core webapi文件上传的更多相关文章
- 解决ASP.NET Core Mvc文件上传限制问题
一.简介 在ASP.NET Core MVC中,文件上传的最大上传文件默认为20MB,如果我们想上传一些比较大的文件,就不知道怎么去设置了,没有了Web.Config我们应该如何下手呢? 二.设置上传 ...
- .net core webapi 文件上传在 Swagger 文档中的有好提示处理
前提: 需要nuget Swashbuckle.AspNetCore 我暂时用的是 4.01 最新版本: 描述:解决 .net core webapi 上传文件使用的是 IFormFile,在S ...
- Asp.Net Core实现文件上传
1. Asp.Net Core Mvc方式 public class UploadController : Controller { private IHostingEnvironment _host ...
- asp.net core流式上传大文件
asp.net core流式上传大文件 首先需要明确一点就是使用流式上传和使用IFormFile在效率上没有太大的差异,IFormFile的缺点主要是客户端上传过来的文件首先会缓存在服务器内存中,任何 ...
- asp dotnet core 支持客户端上传文件
本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...
- .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件
asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题 开发环境:ubuntu+vscode 1.导入所需要的包:n ...
- ASP.NET中的文件上传大小限制的问题
一.文件大小限制的问题 首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文 ...
- Asp.net mvc 大文件上传 断点续传
Asp.net mvc 大文件上传 断点续传 进度条 概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...
- .Net Core 图片文件上传下载
当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. ...
随机推荐
- 《Node.js在CLI下的工程化体系实践》成都OSC源创汇分享总结
背景: 随着开发团队规模不断发展壮大,在人员增加的同时也带来了协作成本的增加,业务项目越来越多,类型也各不相同.常见的类型有组件类.活动类.基于React+redux的业务项目.RN项目.Node.j ...
- 从Thread.start()方法看Thread源码,多次start一个线程会怎么样
这篇文章作为Thread类源码剖析的补充,从一个侧面来看Thread源码.也解答了面试高频问题:"多次start一个线程会怎么样?" 答案是:java.lang.IllegalTh ...
- Linux入门之常用命令(4)vi编辑器
vi分为三种模式 一般模式:删除字符.删除整行.复制粘贴等操作 编辑模式:i o a r进入 输入字符 Esc退出 命令行模式::或/ 将光标移动到最末行 搜寻数据 读取或替换 退出vi 显示行号 ...
- 初识Hibernate之关联映射(一)
上篇文章我们对持久化对象进行的学习,了解了它的三种不同的状态并通过它完成对数据库的映射操作.但这都是基于单张表的操作,如果两张或者两张以上的表之间存在某种关联,我们又该如何利用持久化对象进行操作呢?本 ...
- linux下快速列出文件列表的方法
前言 这两天碰到一个很棘手的问题,需要读取出ubuntu系统中某个目录下所有文件,由于服务器中存储的文件实在太多,导致此过程效率十分低下,动辄需要等待一个小时之久,还只是一个目录.于是如何快速获取文件 ...
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- 远程连接MySQL,防火墙阻止访问,解决方法
远程连接MySQL,防火墙阻止访问,解决方法 xp/2003添加防火墙例外端口 打开防火墙,选择例外选项卡,添加端口 名称:mysqlport 端口号:3306 选中TCP win7添加防火墙例外 ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...
- jquery系列教程1-选择器全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...
- Python基础2 编码和逻辑运算符
编码: AscII码 :标准ASCII码是采用7位二进制码来编码的,当用1个字节(8位二进制码)来表示ASCII码时,就在最高位添加1个0. 一个英文字母占一个字节 8位(bit)==一个字节(byt ...