首页 > 解决方案 > 如何使用 PutObjectAsync 使用 dotnet SDK 将 base64 pdf 上传到 S3

问题描述

我正在尝试使用 dotnet SDK 将 base64 pdf 上传到 S3。该文件正在上传,但显示为空白 pdf。我错过了什么吗?

我认为问题可能与我上传它的方式有关?我试过只使用 illustrationDocumentBody 并将其作为字节发送。illustrationDocumentBody 本身会上传文件,但当我尝试在 S3 中查看它时,我无法加载 pdf。

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。Sendgrid 也使用 base64 字符串作为电子邮件发送,并且它正在工作,所以我认为它与 base64 字符串无关。

标签: c#.netpdfamazon-s3sdk

解决方案


PDF 是二进制文件——它们不是纯文本。

您正在获取 base64 编码的二进制文件,并使用Convert.FromBase64String(illustrationDocumentBody)(这很好)将其转换回字节数组,但随后您将该二进制 PDF 数据解释为 UTF-8 字符串(使用Encoding.UTF8.GetString(...))。

但是,PDF 数据不是字符串,不能解释为字符串。

您可能想要使用PutObjectRequest.InputStream(它允许您使用任何二进制数据,作为 a Stream),而不是PutObjectRequest.ContentBody(仅支持字符串)。

从字节数组中获取 a 的最简单方法Stream是使用 a 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
    });
}

推荐阅读