最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库。最先来的问题就是上传文件的问题。

post文件的一些坑

使用默认模板创建webapi的controller后,post请求,默认有

请求使用了[frombody]标记,用来指示用请求体里获得数据。

对于文件上传请求,直接在这个post函数里使用request.form.files是不行的,无法成功路由。
典型上传,需要设置前端发送的请求content-typemultipart/form-data,然后在控制器类加上特性修饰:

指示该controller能够接受multipart/form-data形式的数据。对应的,修改post的代码如下:

这里需要注意,使用的是iformcollection。这是iform的类型集合,实际上就是request.form

注意,很多地方写了可以使用iformfile,直接写成

实际测试没有办法获取到对象,file常态为null,或者是我方法不对。

然后就可以在post方法里面使用files.files来枚举文件了,每个文件都是一个iformfile对象,可以灵活使用filename, name,length等常用属性。当然,我们也可以不带参数:

直接使用request.form.files获得文件数据。

p.s. 对于iformfile,与system.io.file对象不同,iformfile缺少很多方法,只提供openreadstream()方法,该方法返回一个stream对象。很多读文件的api都可以接受stream作为filepath的替代。

同时上传其他数据

一般的文件上传请求,不单上传文件数据,通常还需要上传其他文件信息数据(比如文件类型,上传者等等)。修改一下post方法,改成这样:

将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]了。

后记

回想起当年做webservice的时候,上传文件写的

,感触颇多,以前是转码到base64,通过string发送,现在是直接类型识别…

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