簡體   English   中英

API解碼通過ReadAsMultipartAsync接收的Base64編碼文件

[英]API decode a Base64 encoded file received via ReadAsMultipartAsync

我有一個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編碼。

題:
在將文件保存到硬盤驅動器之前解碼文件的正確方法是什么?

您需要編寫自己的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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM