关闭

MultipartFormDataMemoryStreamProvider修正以支持非IIS宿主的情况

标签: webapiMultipart
1738人阅读 评论(0) 收藏 举报
分类:
最近做上传,发现以前写的《WebAPI通过multipart/form-data方式接收文件时由开发自行决定如何保存文件》在owin下会取不到文件,所以这里重新修正了下,具体代码如下
    using System.IO;
    using System.Net.Http;
    using System.Net.Http.Headers;
    public class MultipartFormDataMemoryStreamProvider : MultipartFormDataStreamProvider
    {
        public MultipartFormDataMemoryStreamProvider()
            : base("/")
        {
        }

        public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
        {
            if (parent == null)
            {
                throw new ArgumentNullException("parent");
            }
            if (headers == null)
            {
                throw new ArgumentNullException("headers");
            }
            MemoryStream stream = new MemoryStream();
            if (IsFileContent(parent, headers))
            {
                MultipartFileData item = new MultipartFileDataStream(headers, string.Empty, stream);
                this.FileData.Add(item);
            }
            return stream;
        }
        private bool IsFileContent(HttpContent parent, HttpContentHeaders headers)
        {
            ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition;
            if (contentDisposition == null)
            {
                throw new InvalidOperationException("Content-Disposition error");
            }
            return !string.IsNullOrEmpty(contentDisposition.FileName);
        }
    }
    public class MultipartFileDataStream : MultipartFileData, IDisposable
    {
        /// <summary>
        /// file content stream
        /// </summary>
        public Stream Stream { get; private set; }
        public MultipartFileDataStream(HttpContentHeaders headers, string localFileName, Stream stream)
            : base(headers, localFileName)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            this.Stream = stream;
        }
        public void Dispose()
        {
            this.Stream.Dispose();
        }
    }
使用方式基本没变化,只是取Stream的地方有所调整
if (!Request.Content.IsMimeMultipartContent())
{
    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
Dictionary<string, string> dic = new Dictionary<string, string>();
#region 原来使用MultipartFormDataStreamProvider的方式
//string root = HttpContext.Current.Server.MapPath("~/App_Data");//指定要将文件存入的服务器物理位置
//var provider = new MultipartFormDataStreamProvider(root);
#endregion
string root = AppDomain.CurrentDomain.BaseDirectory;
var provider = new MultipartFormDataMemoryStreamProvider();
try
{
    // Read the form data.
    await Request.Content.ReadAsMultipartAsync(provider);

    // This illustrates how to get the file names.
    foreach (MultipartFileData file in provider.FileData)
    {//接收文件
        Trace.WriteLine(file.Headers.ContentDisposition.FileName);//获取上传文件实际的文件名
        Trace.WriteLine("Server file path: " + file.LocalFileName);//获取上传文件在服务上默认的文件名
        var stream = ((MultipartFileDataStream)file).Stream;
        using (StreamWriter sw = new StreamWriter(Path.Combine(root, file.Headers.ContentDisposition.FileName)))
        {
            stream.CopyTo(sw.BaseStream);
            sw.Flush();
        }
    }
    foreach (var key in provider.FormData.AllKeys)
    {//接收FormData
        dic.Add(key, provider.FormData[key]);
        Console.WriteLine($"Key:{key}  Value:{provider.FormData[key]}");
    }
}
catch(Exception ex)
{
    throw;
}


   
0
0
查看评论

WebAPI通过multipart/form-data方式接收文件时由开发自行决定如何保存文件

今年4月份写的《WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)》中,有提到用MultipartFormDataStreamProvider来接收文件时,会自动将文件保存至指定目录下,代码中还备注了下有时间研究下如何不直接保存文件,...
  • starfd
  • starfd
  • 2015-09-22 13:47
  • 12945

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

简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1、HttpClient部分: HttpClient通过PostAsync提交数据时,第二个请求参数为抽象类HttpCont...
  • starfd
  • starfd
  • 2015-04-30 13:01
  • 48143

利用MultipartFile实现文件上传

利用MultipartFile实现文件上传         在java中上传文件似乎总有点麻烦,没.net那么简单,记得最开始的时候用smartUpload实现文件上传,最近在工作中使用spring的MultipartF...
  • hbcui1984
  • hbcui1984
  • 2007-01-30 17:38
  • 123035

SpringMVC 文件上传配置,多文件上传,使用的MultipartFile

基本的SpringMVC的搭建在我的上一篇文章里已经写过了,这篇文章主要说明一下如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤 SpringMVC 基础教程 框架分析:http://blog.csdn.net/swingpyzf/article/details/88854...
  • SwingPyzf
  • SwingPyzf
  • 2014-03-01 20:17
  • 295326

MVC5 实现文件上传

MultipartMemoryStreamProvider
  • tz2101
  • tz2101
  • 2017-01-04 17:22
  • 1230

webapi不使用MultipartFormDataStreamProvider上传multipart form-data数据的方法

webapi开发中,经常会使用multipart/form-data方式来实现文件的上传。而网上流传甚广的就是下面这样一份代码。但是,这份代码有个问题,就是初始化MultipartFormDataStreamProvider类或者子类时,需要制定文件的保存路径。但是,有些应用场景是无法指定这个路径的...
  • tiana0
  • tiana0
  • 2017-03-21 20:06
  • 2565

MultipartFormDataMemoryStreamProvider修正以支持非IIS宿主的情况

最近做上传,发现以前写的《WebAPI通过multipart/form-data方式接收文件时由开发自行决定如何保存文件》在owin下会取不到文件,所以这里重新修正了下,具体代码如下 using System.IO; using System.Net.Http; using S...
  • starfd
  • starfd
  • 2016-11-23 18:13
  • 1738

IIS回收情况说明

本文内容基于win7的IIS7.5,该篇内容主要说明什么情况会导致IIS进行回收,以便于当出现回收问题时快速定位问题 通过控制面板下的管理工具,可以打开 Internet 信息服务(IIS)管理器,打开后界面大致如下: 通过选择“应用程序池”,然后选中你要维护的程序池,最右侧栏目可以看...
  • starfd
  • starfd
  • 2016-12-14 17:21
  • 1803

【菜鸟学WCF】以IIS为宿主创建WCF服务及问题解决

编译环境为:VS2010旗舰版     刚开始学
  • ZAIJIANLUOYE110
  • ZAIJIANLUOYE110
  • 2014-05-07 20:51
  • 918

用IIS做宿主的WCF服务

第一步创建WCF项目:WCFSolution 第二步选择WCFSolution点击右键选择添加->新建网站->Visual C#->WCF服务 创建好以上2个项目如下图所示: 第三步,修改Service.svc文件,修改后的语句如下: 开始创建的wcf服务要添加到该...
  • huwei2003
  • huwei2003
  • 2012-11-29 15:08
  • 2548
    个人资料
    • 访问:384471次
    • 积分:4090
    • 等级:
    • 排名:第8967名
    • 原创:78篇
    • 转载:4篇
    • 译文:0篇
    • 评论:132条
    文章分类
    最新评论