c# - 如何使用 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 字符串无关。
解决方案
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
});
}