Я использую TransferUtility
, чтобы получить поток из файла на s3. Если я CopyTo
потока в другой поток, он будет правильно скопировать, если я ReadAsync
его в byte[]
, результат будет правильным только до 16 КБ. (Таким образом, я получаю разные хэши в следующем коде).
Что мне не хватает?
private static (string region, string bucketName, string path, string accessKey, string secretAccessKey, string targetFile) info =
("eu-west-1", "MyBucketName", "MyFilePath", "MyAccessKey", "MySecretAccessKey", "target/path/on/local/machine.pdf");
static async Task Main()
{
var request = new TransferUtilityOpenStreamRequest
{
BucketName = info.bucketName,
Key = info.path
};
var transferUtilty = new TransferUtility(info.accessKey, info.secretAccessKey, Amazon.RegionEndpoint.EUWest1);
using (var s3Stream = await transferUtilty.OpenStreamAsync(request))
using (var fileStream = new FileStream(info.targetFile, FileMode.Create, FileAccess.Write))
{
await s3Stream.CopyToAsync(fileStream);
fileStream.Close();
}
using (var fileStream = new FileStream(info.targetFile, FileMode.Open, FileAccess.Read))
{
var bytes = new byte[fileStream.Length];
await fileStream.ReadAsync(bytes, 0, bytes.Length);
Console.WriteLine(Convert.ToBase64String(MD5.Create().ComputeHash(bytes)));
}
using (var s3Stream = await transferUtilty.OpenStreamAsync(request))
{
var bytes = new byte[s3Stream.Length];
await s3Stream.ReadAsync(bytes, 0, bytes.Length);
Console.WriteLine(Convert.ToBase64String(MD5.Create().ComputeHash(bytes)));
}
}
ps: файл размером около 60 КБ. Я также даю файл проекта, на всякий случай.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.3.101" />
<PackageReference Include="AWSSDK.S3" Version="3.3.110.50" />
</ItemGroup>
</Project>