AWS S3 读取流的问题

因为业务,需要将两张MongoDB 表的数据切换到 AWS 的S3中,再切换中发现下面的代码;先删除整个TempFiles 目录,将流写到特定文件中,然后再读出来; 通过尝试修改,认为前人是为了解决AWS 获取的流是不能直接拿来,才这么处理的。但是这样处理会有并发问题。

var request = new GetObjectRequest
{
	BucketName = bucket.StartsWith(BucketPrefix) ? bucket : BucketPrefix + bucket,
	Key = key
};

var tempDirectory = AppDomain.CurrentDomain.BaseDirectory + "/App_Data/TempFiles/";

if (Directory.Exists(tempDirectory))
{
	var tempFiles = Directory.GetFiles(tempDirectory);
	foreach (var tempFile in tempFiles)
	{
		try
		{
			if (File.Exists(tempFile))
			{
				File.Delete(tempFile);
			}
		}
		catch (Exception ex)
		{
			Logger.Debug($"Can't delete temp file {tempFile}. Eception={ex.Message}");
		}
	}
}

using (GetObjectResponse response = await Client.GetObjectAsync(request).ConfigureAwait(false))
{
	// the response stream from amazon is encrypt, so wo have to write stream to a temp file.
	var tempFilePath = Path.Combine(tempDirectory + Guid.NewGuid());
	response.WriteResponseStreamToFileAsync(tempFilePath, append: false, CancellationToken.None).GetAwaiter().GetResult();
	var fileName = response.Metadata["x-amz-meta-title"];

	return new ReadFileAsyncResult
	{
		FileStream = new FileStream(tempFilePath, FileMode.Open, FileAccess.Read, FileShare.Read),
		FileName = fileName
	};
}

  

通过求教 获取了一个新的方法


var
request = new GetObjectRequest { BucketName = bucket.StartsWith(BucketPrefix) ? bucket : BucketPrefix + bucket, Key = key }; using (GetObjectResponse response = await Client.GetObjectAsync(request).ConfigureAwait(false)) { var fileName = response.Metadata["x-amz-meta-title"]; var memoryStream = new MemoryStream(); response.ResponseStream.CopyTo(memoryStream); memoryStream.Position = 0; return new ReadFileAsyncResult { FileStream = memoryStream, FileName = fileName };
}
原文地址:https://www.cnblogs.com/zhihang/p/11280023.html