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

最新文章

  1. 如何为编程爱好者设计一款好玩的智能硬件(十)——无线2.4G通信模块研究&#183;一篇说完
  2. BZOJ4491: 我也不知道题目名字是什么
  3. 2014 Hangjs 见闻流水账第一天
  4. HTML中的一些常见的事件句柄
  5. 【题解】【矩阵】【DP】【Leetcode】Minimum Path Sum
  6. 第二百三十二天 how can I 坚持
  7. 设计模式的C++实现 2.工厂模式
  8. linux中移动光标
  9. Lily_music 网页音乐播放器 -可搜索(附歌词联动播放效果解说)
  10. 【转载】Sikuli安装及使用——基于图像识别自动化工具
  11. vscode 编辑markdown文件
  12. 01、Spar内核架构原理
  13. OpenCV 的颜色空间转换
  14. DropDownListFor的种种纠结(禁止转载)
  15. NET的基本用法(摘)
  16. android进入页面会定位到ListView问题解决方法
  17. WeifenLuo.WinFormsUI.Docking.dll的用法
  18. 2.7 Go channel
  19. 点滴积累【C#】---将Excel数据导入到数据库
  20. ETCD数据空间压缩清理

热门文章

  1. windows下配置Groovy
  2. tomcat启动报错:java.lang.IllegalArgumentException: Document base D:\apache-tomcat-6.0.45\webapps\activiti-explorer does not exist or is not a readable directory
  3. WordPaster2项目变化
  4. Android AIDL的用法
  5. DELPHI XE5-8 弹出列表框供选择
  6. [LeetCode 题解]: Count and Say
  7. HDU 1496
  8. 利用html5 postMessage接口跨域设置iframe大小
  9. Nexys4 DDR MIG控制器引脚文件
  10. Ubuntu sudo apt-get update提示 Failed to fetch,解决办法