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

原创 2016年11月23日 18:13:39
最近做上传,发现以前写的《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;
}


                    
版权声明:本文为starfd原创文章,未经博主允许不得转载。

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

今年4月份写的《WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)》中,有提到用MultipartFormDataStreamProv...
  • starfd
  • starfd
  • 2015年09月22日 13:47
  • 11757

ASP.NET WebApi 实现多附件上传

前几天调查 ASP.NET WebApi 实现 multipart/form-data 文件上传功能时,遇到一个问题正好记录下来。multipart/form-data 经常用于多附件上传,其中数据是...

VS2012程序打包部署详解

上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结。程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具。不知道出于什么原因...

Java 抽象类经典例子2

Java 抽象类经典例子2目录Java 抽象类经典例子2目录 问题描述 代码块 答案问题描述抽象类的练习 学生案例: 具体类:一般学生 优秀学生 共性:姓名 年龄 年...

宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)

1. 创建WCF服务  在vs2010中创建WCF服务应用程序,会自动生成一个接口和一个实现类:(IService1和Service1)  IService1接口如下: using System...

宿主在Windows Service中的WCF(创建,安装,调用) (host到exe,非IIS)

1. 创建WCF服务  在vs2010中创建WCF服务应用程序,会自动生成一个接口和一个实现类:(IService1和Service1)  IService1接口如下: [csharp] v...
  • libo250
  • libo250
  • 2014年10月08日 00:26
  • 508

remoting宿主到IIS中

  • 2010年05月25日 11:45
  • 69KB
  • 下载

WCF服务演示程序(IIS宿主)

  • 2011年12月13日 15:23
  • 58KB
  • 下载

采用nettcp绑定的wcf宿主到iis7

采用nettcp绑定的wcf宿主到iis7 也许事情太杂了记忆力明显下降,做过的东西很容易忘记。上次成功将采用nettcp绑定方式的wcf部署到iis7,重新来做已经忘得差不多了。 重新在...
  • nic7968
  • nic7968
  • 2012年09月14日 01:22
  • 538

WCF BasicHttpBinding 安全解析(4)windows验证(IIS宿主)

现在我们讨论TransportCredentialOnly安全模式下的安全配置,首先在配置文件中添加如代码清单11-84所示的配置节,配置windows验证。Windows凭据认证是基于Windows...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MultipartFormDataMemoryStreamProvider修正以支持非IIS宿主的情况
举报原因:
原因补充:

(最多只允许输入30个字)