API解码通过ReadAsMultipartAsync接收的Base64编码文件

时间:2014-05-09 01:12:19

标签: c# asp.net-web-api

我有一个API,它接收一个150K编码(base64)视频文件,我使用此代码保存在硬盘上:

var provider = new Base64MultipartFileStreamProvider("C:\\sample.avi");
await Request.Content.ReadAsMultipartAsync(streamProvider);

我的目标是在将其保存到磁盘之前对其进行解码,以便使用个性化提供程序 Base64MultipartFileStreamProvider:MultipartFileStreamProvider 并覆盖GetStream方法,如下所示:

public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
{    
   Collection<MultipartFileData> _fileData = new Collection<MultipartFileData>();
   MultipartFileData fileData = new MultipartFileData(headers, fullPath);
   _fileData.Add(fileData);

   var stream = File.Create(fullPath, 0x1000, FileOptions.Asynchronous);
   return new CryptoStream(stream, new FromBase64Transform(), 
                           CryptoStreamMode.Write);
}

这会将收到的文件保存为C:\ sample.avi,但该文件仍为base64编码。

问题:
在将文件保存到硬盘驱动器之前解码文件的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

您需要编写自己的StreamProvider,从文件流提供程序开始最简单。

这只是一个草图,由您决定是否正常工作

当你获得文件流时,在将其写入文件之前用一个cryptostream包装它:

这是一个粗略的草图,使用下面的提供程序而不是示例中的提供程序:

public class Base64MultiPartFileStreamProvider : MultipartFormDataStreamProvider
{
    public Base64MultiPartFileStreamProvider(string path) : base(path)
    {
    }

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
    {
       var stream = base.GetStream(parent, headers);

      ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition;
      if (contentDisposition != null)
      {
          if (!string.IsNullOrEmpty(contentDisposition.FileName))
          {
              stream = new CryptoStream(stream, new FromBase64Transform(), CryptoStreamMode.Write);
          }
      }

      return stream;
    }
}