Web API文件上传下载

     最近一个比较特殊的需求,WebAPI实现文件上传和下载.  参照web网页,最简单的就是 表单提交方式了,可是我要实现的这个,给使用者调用是在后台调用的,没有file控件...只能另辟蹊径.

 我需要的上传功能是: 对方通过 二进制文件流 而不是路径的方式上传文件,并且还要附带其他的 键值对信息.  然后我服务器这边收到 二进制文件流,本地不存(安全需要),我再把该文件流以

HTTP报文的形式,上传到另外的接口上,本身我只是做一个 文件流接口中转, 我这边的服务器上不存放文件.

    博客园上找了一些 大牛的实现方式  http://blog.csdn.net/starfd/article/details/45393089   , 参照这个例子, 最后发现并不是我要的功能. 该文章中,作者也提到了,这样直接就把文件存在服务器上了.

 

 

  有关文件接收的方式 上面作者使用的 MultipartFormDataStreamProvider, 给了我一个启发, 我能否通过别的方式获取, 在网上又找了一些资料,查到

  还可以用这个 MultipartMemoryStreamProvider() 去接收参数. 于是本地写了一个测试的例子, 代码的关键部分我贴出来 如下:

说明: 此段代码 需要.net framework 4.5 框架

         [HttpPost]
         public HttpResponseMessage Post()
         {
             if (!Request.Content.IsMimeMultipartContent())
             {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
             }
 
             Guid groupGuid = Guid.NewGuid();
             try
             {
                 Stream ms = null;
                 string filename = "";
                 string docSignDataJson = "";
                 var sp = new MultipartMemoryStreamProvider();
                 Task.Run(async () => await Request.Content.ReadAsMultipartAsync(sp)).Wait();
 
                 foreach (var item in sp.Contents)
                 {
                     //这里获取 键值对
                     if (item.Headers.ContentDisposition.Name != null)
                     {
                         string key = item.Headers.ContentDisposition.Name;
                          string value= item.ReadAsStringAsync().Result;
                     }
 
                     //这里获取上传文件
                     if (item.Headers.ContentDisposition.FileName != null)
                     {
                         filename = item.Headers.ContentDisposition.FileName.Replace("\"", "");
                         ms = item.ReadAsStreamAsync().Result; 
                         Trace.WriteLine(ms.Length);
                     }
                 }
 
                 return  Request.CreateResponse(HttpStatusCode.OK, new Root<string>(true, "0", "接口调用成功" + groupGuid));
             }
             catch (Exception ex)
            {
                 string errMsg = ex.Message;
                 if (ex.InnerException != null)
                 {
                    errMsg += ex.InnerException.Message;
                 }
                return Request.CreateResponse(HttpStatusCode.OK, new Root<string>(false, "-1", "接口调用失败" + groupGuid));
            }

 

就这样我既可以得到键值对,也可以得到 文件流. 大功告成.

 

Demo下载地址 :   https://files.cnblogs.com/files/mjxxsc/UploadFileWebAPI.rar 

  

posted @ 2017-08-10 16:35  兴想事成  阅读(213)  评论(0编辑  收藏  举报