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
本文来自博客园,作者:兴想事成,转载请注明原文链接:https://www.cnblogs.com/mjxxsc/articles/7340029.html