【发布时间】:2018-02-01 13:35:30
【问题描述】:
所以我有一个文件上传表单(上传后)加密文件并将其上传到 S3 存储桶。但是,我正在做一个我想避免的额外步骤。首先,我将向您展示我现在正在做的一些代码:
using (MemoryStream memoryStream = new MemoryStream())
{
Security.EncryptFile(FileUpload.UploadedFile.OpenReadStream(), someByteArray, memoryStream);
memoryStream.Position = 0; // reset it's position
await S3Helper.Upload(objectName, memoryStream);
}
我的Security.EncryptFile 方法:
public static void EncryptFile(Stream inputStream, byte[] key, Stream outputStream)
{
CryptoStream cryptoStream;
using (SymmetricAlgorithm cipher = Aes.Create())
using (inputStream)
{
cipher.Key = key;
// aes.IV will be automatically populated with a secure random value
byte[] iv = cipher.IV;
// Write a marker header so we can identify how to read this file in the future
outputStream.WriteByte(69);
outputStream.WriteByte(74);
outputStream.WriteByte(66);
outputStream.WriteByte(65);
outputStream.WriteByte(69);
outputStream.WriteByte(83);
outputStream.Write(iv, 0, iv.Length);
using (cryptoStream =
new CryptoStream(inputStream, cipher.CreateEncryptor(), CryptoStreamMode.Read))
{
cryptoStream.CopyTo(outputStream);
}
}
}
S3Helper.Upload 方法:
public async static Task Upload(string objectName, Stream inputStream)
{
try
{
// Upload a file to bucket.
using (inputStream)
{
await minio.PutObjectAsync(S3BucketName, objectName, inputStream, inputStream.Length);
}
Console.Out.WriteLine("[Bucket] Successfully uploaded " + objectName);
}
catch (MinioException e)
{
Console.WriteLine("[Bucket] Upload exception: {0}", e.Message);
}
}
所以,上面发生的事情是我正在创建一个 MemoryStream,运行 EncryptFile() 方法(将其输出回流),我重置流位置,最后再次重用它以将其上传到 S3 存储桶( Upload())。
问题
我想做的是以下(如果可能的话):直接将上传的文件上传到 S3 存储桶,而不是先将完整文件存储在内存中(有点像下面的代码,即使它不起作用):
await S3Helper.Upload(objectName, Security.EncryptFile(FileUpload.UploadedFile.OpenReadStream(), someByteArray));
所以我假设它必须向 Upload 方法返回一个缓冲区,该方法将上传它,并等待 EncryptFile() 方法再次返回一个缓冲区,直到文件被完全读取。任何指向正确方向的指针将不胜感激。
【问题讨论】:
-
这根本不会产生任何收益,EncryptFile 无论如何都会在内部创建一个 MemoryStream,因为您需要将其返回到 Upload,唯一的区别是创建流的位置。
-
您对 EncryptFile 的调用不应该为 outputStream 使用 ref 或 out 参数吗?