我有一个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编码。
问题:
在将文件保存到硬盘驱动器之前解码文件的正确方法是什么?
答案 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;
}
}