最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库。最先来的问题就是上传文件的问题。
POST文件的一些坑
使用默认模板创建webapi的controller后,post请求,默认有
| 
 
								1
 
								2
 
								3
 
								4
 
								5
						  | 
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
 | 
	请求使用了[FromBody]标记,用来指示用请求体里获得数据。
	对于文件上传请求,直接在这个Post函数里使用Request.Form.Files是不行的,无法成功路由。
	典型上传,需要设置前端发送的请求Content-Type为multipart/form-data,然后在控制器类加上特性修饰:
| 
 
								1
 
								2
 
								3
 
								4
						  | 
[Produces("application/json")]
[Consumes("application/json", "multipart/form-data")]//此处为新增
[Route("api/[controller]")]
public class FileController : Controller
 | 
	指示该controller能够接受multipart/form-data形式的数据。对应的,修改post的代码如下:
| 
 
								1
 
								2
 
								3
						  | 
// POST: api/File
[HttpPost]
public Task<ActionResult> Post(IFormCollection files)
 | 
	这里需要注意,使用的是IFormCollection。这是IForm的类型集合,实际上就是Request.Form。
注意,很多地方写了可以使用IFormFile,直接写成
| 
 
								1
 
								2
 
								3
						  | 
// POST: api/File
[HttpPost]
public Task<ActionResult> Post(IFormFile file)
 | 
实际测试没有办法获取到对象,file常态为null,或者是我方法不对。
然后就可以在post方法里面使用files.Files来枚举文件了,每个文件都是一个IFormFile对象,可以灵活使用FileName, Name,Length等常用属性。当然,我们也可以不带参数:
| 
 
								1
 
								2
 
								3
						  | 
// POST: api/File
[HttpPost]
public Task<ActionResult> Post()
 | 
直接使用Request.Form.Files获得文件数据。
	P.S. 对于IFormFile,与System.IO.File对象不同,IFormFile缺少很多方法,只提供OpenReadStream()方法,该方法返回一个stream对象。很多读文件的API都可以接受stream作为FilePath的替代。
同时上传其他数据
一般的文件上传请求,不单上传文件数据,通常还需要上传其他文件信息数据(比如文件类型,上传者等等)。修改一下post方法,改成这样:
| 
 
								1
 
								2
						  | 
[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]了。
| 
 
								1
 
								2
						  | 
[HttpPost]
public Task<ActionResult> Post(string type,IFormCollection files)
 | 
后记
	回想起当年做WebService的时候,上传文件写的
	多平台上传
	,感触颇多,以前是转码到base64,通过string发送,现在是直接类型识别…
到此这篇关于asp.net core webapi文件上传的文章就介绍到这了,更多相关asp.net core webapi文件上传内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!
原文链接:https://www.cnblogs.com/podolski/p/7795168.html
相关文章
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
 - 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
 - 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
 - ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
 - ASP.NET自助建站系统的域名绑定与解析教程 2025-06-10
 
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
 - 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
 - 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
 - 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
 - 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
 
快网idc优惠网
QQ交流群
- 
            2025-05-29 49
 - 
            2025-05-27 46
 - 
            
Java源码解析CopyOnWriteArrayList的讲解
2025-05-29 85 - 
            2025-05-25 75
 - 
            2025-05-25 20
 
        
    		
            	
        
        