Загрузка объектов из Amazon S3 с использованием AWS SDK - результирующий файл поврежден - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть. Net Core 3.1 Web API, который загружает объект (PDF) из Amazon S3 на диск, используя библиотеку AWS SDK.

using Amazon.S3;
using Amazon.S3.Model;
using System.IO;

private void DownloadObject()
{
    BasicAWSCredentials awsCredentials = new Amazon.Runtime.BasicAWSCredentials("MyAccessKey", "MySecretKey");
    IAmazonS3 client = new Amazon.S3.AmazonS3Client(awsCreden‌​tials, Amazon.RegionEndpoint.USEast1);

    GetObjectRequest request = new GetObjectRequest
    {
        BucketName = "mybucket",
        Key = "test.pdf"
    };

    using (GetObjectResponse response = await client.GetObjectAsync(request))
    {
        using (Stream responseStream = response.ResponseStream)
        {
           using (StreamReader reader = new StreamReader(responseStream))
           {
               string responseBody = await reader.ReadToEndAsync();
               File.WriteAllText("C:\\test.pdf", responseBody);
           }
        }
    }
}

При загрузке PDF, размер файла неправильный (слишком большой), и если я открою PDF, все страницы будут пустыми. Это происходит и с другими типами файлов. Например, если я загружаю JPEG, я не могу открыть его - он поврежден. Это проблема с кодировкой?

1 Ответ

2 голосов
/ 21 февраля 2020

Строковое кодирование не допускает округления для произвольных двоичных данных. То есть, обрабатывая произвольный массив byte[] как UTF8, ASCII и т. Д. c. закодированный текст, преобразование byte -> string -> byte часто приводит к другому массиву байтов, чем вы начали с. Предположительно, ваш PDF-файл содержит двоичные данные.

Я рекомендую вместо этого копировать непосредственно из одного потока в другой:

using (GetObjectResponse response = await client.GetObjectAsync(request))
{
    using (Stream responseStream = response.ResponseStream)
    using (FileStream outFile = File.Create("C:\\test.pdf"))
    {
        responseStream.CopyTo(outFile);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...