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上传文件的更多相关文章

  1. Asp.Net Core WebApi 和Asp.Net WebApi上传文件

    public class UpLoadController : ControllerBase { private readonly IHostingEnvironment _hostingEnviro ...

  2. webAPI 上传文件 404错误(转载)

    webAPI文件上传时文件过大404错误的问题  来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...

  3. WebApi上传文件

    上网搜了下Web Api上传文件的功能,发现都写的好麻烦,就自己写了一个,比较简单,直接上传文件就可以,可以用Postman测试. 简单的举例 /// <summary> /// 超级简单 ...

  4. .Net Core2.2 WebApi上传文件

    基于.net core2.2的webapi程序,接收客户端上传的文件.按照以下写法,file的值永远是null [HttpPost] public void Post([FromForm] IForm ...

  5. C# WebApi 上传文件

    本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...

  6. (转)WebApi 上传文件

    本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...

  7. 使用swagger上传文件

    经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...

  8. webApi上传下载文件

    上传文件通过webApi html端调用时包含(form提交包含 enctype="multipart/form-data",才可以启作用获取到文件) public class U ...

  9. WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)

    简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...

随机推荐

  1. [SHELL]:let 命令详解

    [SHELL]:let 命令详解 摘自:https://blog.csdn.net/happygongzhuo/article/details/6819099 let :简单的计算器  语 法let[ ...

  2. ethtool -p eth0 物理口一个灯在不停的闪烁

    摘自:https://blog.csdn.net/morigejile/article/details/78598645 你的  服务器有多个网卡并且已经配置好运行当中,你却没记得eth0.eth1. ...

  3. 自定义DropDownMenu菜单

    在JayFang1993 / DropDownMenu的基础上进行修改,最后的到自己想要的效果 本来的效果: 而我最后实现的效果是: 我们先来分析一下DropDownMenu的源代码 需要改动的地方 ...

  4. C# 过滤SQL 字符串中的 参数

    /// <summary> /// 参数过滤 /// </summary> /// <param name="parameters"></ ...

  5. poj2480——Longge's problem(欧拉函数)

    Longge's problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9190   Accepted: 3073 ...

  6. spring源码研究之IoC容器在web容器中初始化过程

    转载自 http://ljbal.iteye.com/blog/497314 前段时间在公司做了一个项目,项目用了spring框架实现,WEB容器是Tomct 5,虽然说把项目做完了,但是一直对spr ...

  7. Spring事务管理—aop:pointcut expression 常见切入点表达式及事物说明

    例: <aop:config>  <aop:pointcut expression="execution(* com.xy.service.*.*(..))"   ...

  8. 关于SVN浏览服务器的错误

    这种错误是因为URL错误,需要把https://iZ1gyqtig7Z/svn/BoLeBang/   换成自己的公网ip地址 https://xx.xx.xx.xxsvn/BoLeBang/ 就可以 ...

  9. python下使用tesserocr遇到的一些坑

    我是在win7 64位系统下用的. 首先是安装tesseract,这个可以去官网下载,我使用的是3.05.1,安装时使用默认安装路径就行了,下载语言包速度很慢很慢,需要等 接下来就是安装tessero ...

  10. MFC学习(三):项目学习

    1. 概述 MFC程序由CWinApp.MainFrm(含Menu,可用CSplitterWndEx分割).众多Dialog等组成. MFC既可以使用纯Dialog的形式,也可以使用Document+ ...