Owin WebAPI上传文件
Owin是微软出了几年的东东了,一直没时间学习。大概了解了下,是一个脱离IIS环境,快速搭建WebAPI服务的东西。
刚好想尝试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模式,前端用Nignx部署html网页,配置反向代理方便ajax访问owin提供的WebAPI接口。
一切都进行的非常顺利,直到遇到上传。
先看看之前使用MVC时候的WebAPI上传文件的方法:
/// <summary>
/// 上传图片
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
[IgnoreAuthority(IgnoreType.IgnoreFeature)]
[HttpPost]
public async Task<JsonResult> UploadImgFile(FormCollection form)
{
OperateStatus operateStatus = new OperateStatus();
if (Request.Files.Count == 0)
{
operateStatus.ResultSign = ResultSign.Error;
operateStatus.Message = "没有找到上传文件";
}
else
{
HttpPostedFileBase file = Request.Files[0];
if (file.ContentLength == 0)
{
operateStatus.ResultSign = ResultSign.Error;
operateStatus.Message = "文件大小不能为0";
}
else
{ }
} return await Task.FromResult(Json(operateStatus));
}
直接拷贝过来,发现FormCollection 不存在啦,存在的也是owin旗下的FormCollection ,采用其他方案,于是又如下代码:
/// <summary>
/// 图片上传 [FromBody]string token
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/Upload/ImgUpload")]
public Task<Hashtable> ImgUpload()
{
// 检查是否是 multipart/form-data
if (!Request.Content.IsMimeMultipartContent("form-data"))
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); // 文件保存目录路径
const string saveTempPath = "~/UploadFiles/";
var dirTempPath = HttpContext.Current.Server.MapPath(saveTempPath); // 设置上传目录
var provider = new MultipartFormDataStreamProvider(dirTempPath); ................后面的没啥用,不粘贴了
}
这样写倒是也可以啦,解决了上传问题,可是这个方法必须把文件保存在服务器上。第一我不想保存文件,只想获取文件流。第二owin搭建的服务也没有保存的位置。于是这种方式排除,下面看最终的代码:
/// <summary>
/// 上传图片
/// </summary>
/// <returns></returns>
public async Task<ResultObj> UploadImgFile()
{
ResultObj resultObj = new ResultObj()
{
Success = false
}; var provider = new MultipartMemoryStreamProvider(); //读取文件数据
await Request.Content.ReadAsMultipartAsync(provider); if (provider.Contents.Count == 0)
{
resultObj.Msg = "没有文件";
}
else
{
var item = provider.Contents[0];
// 判断是否是文件
if (item.Headers.ContentDisposition.FileName != null)
{
//获取到流
var ms = item.ReadAsStreamAsync().Result;
//进行流操作
using (var br = new BinaryReader(ms))
{
if (ms.Length <= 0)
{
resultObj.Msg = "文件长度为空";
}
//读取文件内容到内存中
byte[] data = br.ReadBytes((int) ms.Length);
//data就是取出的文件流啦
........ }
}
else
{
resultObj.Msg = "未知的上传内容";
}
} return resultObj;
}
为了这个,百度了一个下午,还是自己基础太差了。希望对有这方面需求的人有参考吧。
更多个人工作中的项目请访问我的个人网站:www.88gis.cn
Owin WebAPI上传文件的更多相关文章
- Asp.Net Core WebApi 和Asp.Net WebApi上传文件
public class UpLoadController : ControllerBase { private readonly IHostingEnvironment _hostingEnviro ...
- webAPI 上传文件 404错误(转载)
webAPI文件上传时文件过大404错误的问题 来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...
- WebApi上传文件
上网搜了下Web Api上传文件的功能,发现都写的好麻烦,就自己写了一个,比较简单,直接上传文件就可以,可以用Postman测试. 简单的举例 /// <summary> /// 超级简单 ...
- .Net Core2.2 WebApi上传文件
基于.net core2.2的webapi程序,接收客户端上传的文件.按照以下写法,file的值永远是null [HttpPost] public void Post([FromForm] IForm ...
- C# WebApi 上传文件
本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...
- (转)WebApi 上传文件
本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...
- 使用swagger上传文件
经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...
- webApi上传下载文件
上传文件通过webApi html端调用时包含(form提交包含 enctype="multipart/form-data",才可以启作用获取到文件) public class U ...
- WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)
简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...
随机推荐
- 使用DBMS_SCHEDULER包管理计划任务
Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PL\SQL程序.执行外部脚本.调用操作系统命令,通常用于创建定期定时的任务,不依赖操作系统,保存在数据库内,数据库迁 ...
- JavaScript 与JQuery 常用方法比较
http://drupalchina.cn/content/javascript-yu-jquery-chang-yong-fang-fa-bi-jiao 1.加载DOM区别 JavaScript: ...
- Smarty简介
Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一.它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离. ...
- MSSQL数据库高版本迁移到低版本
起因是因为客户要把系统从阿里云迁移到本地服务器,阿里云上的数据库版本是MSSQL2016,客户提供的服务器是Server2008R2的,问题就来了,Server2008不支持2016版本,最后只能装的 ...
- 编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间
建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比 ...
- IIC接口总线
转载:http://www.eefocus.com/article/08-07/48416s.html图11-1给出一个由MCU作为主机,通过IIC总线带3个从机的单主机IIC总线系统.这是最常用.最 ...
- RDD介绍与执行
repartition 增加或减少分区.会产生shuffle.(多个分区分到一个分区不会产生shuffle) coalesce coalesce常用来减少分区,第二个参数是减少分区的过程中是否产生sh ...
- Gym - 100971J ——DFS
Statements Vitaly works at the warehouse. The warehouse can be represented as a grid of n × mcells, ...
- [LeetCode 题解]:Gray Code
题目描述: The gray code is a binary numeral system where two successive values differ in only one bit. G ...
- .net core i上 K8S(五).netcore程序的hostip模式
上一章讲了pod的管理,今天再分享一个pod的访问方式 1.Pod的HostIP模式 Pod的HostIP模式,可以通过宿主机访问pod内的服务,创建yaml文件如下 apiVersion: v1 k ...