Как загрузить base64 pdf в S3 с помощью dotnet SDK с помощью PutObjectAsync - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь загрузить base64 pdf на S3 с помощью dotnet SDK.Файл загружается, но отображается как пустой PDF-файл.Я что-то упустил?

Я думаю, что проблема может быть связана с тем, как я его загружаю?Я попытался просто использовать illustrationDocumentBody и отправить его в виде байтов.illustrationDocumentBody сам загружает файл, но не дает мне возможности загрузить pdf, когда я пытаюсь просмотреть его в S3.

try
{
      await s3Client.PutObjectAsync(new PutObjectRequest
      {
                ContentBody = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(illustrationDocumentBody)),
                ContentType = "application/pdf",
                BucketName = Environment.GetEnvironmentVariable("ESIS_SYNC_BUCKET"),
                Key = $"Opportunities/{oppName}/ESIS-{brokerName}-{productCode}-{customerName}.pdf",
                CannedACL = S3CannedACL.BucketOwnerFullControl
      });
}
catch (AmazonS3Exception e)
{
      Console.WriteLine(
                    "Error encountered ***. Message:'{0}' when writing an object", e.Message);
}
catch (Exception e)
{
      Console.WriteLine(
                "Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
}

Я ожидаю, что смогу просмотреть PDF, но вместо этого он загружает пустой PDF.Строка base64 также используется Sendgrid для отправки по электронной почте, и это работает, поэтому я не думаю, что это связано со строкой base64.

1 Ответ

2 голосов
/ 20 сентября 2019

PDF-файлы - это двоичные файлы - они не являются обычным текстом.

Вы берете свой двоичный файл в кодировке base64 и превращаете его обратно в байтовый массив, используя Convert.FromBase64String(illustrationDocumentBody) (что нормально),но затем вы интерпретируете эти двоичные данные PDF как строку UTF-8 (с Encoding.UTF8.GetString(...)).

Но данные PDF не являются строкой и не могут быть интерпретированы как строка.

Возможно, вы захотите использовать PutObjectRequest.InputStream (что позволяет использовать любые двоичные данные как Stream), а не PutObjectRequest.ContentBody (который поддерживает только строку).

Самый простой способчтобы получить Stream из байтового массива, используйте MemoryStream.

using (var inputStream = new MemoryStream(Convert.FromBase64String(illustrationDocumentBody)))
{
    await s3Client.PutObjectAsync(new PutObjectRequest
    {
        InputStream = inputStream,
        ContentType = "application/pdf",
        BucketName = Environment.GetEnvironmentVariable("ESIS_SYNC_BUCKET"),
        Key = $"Opportunities/{oppName}/ESIS-{brokerName}-{productCode}-{customerName}.pdf",
        CannedACL = S3CannedACL.BucketOwnerFullControl
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...