Поток, возвращенный из TransferUtility, нельзя использовать для заполнения массива байтов. - PullRequest
0 голосов
/ 14 апреля 2020

Я использую 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...