使用 AWS SDK 从 Amazon S3 下载对象 - 结果文件已损坏

Downloading objects from Amazon S3 using AWS SDK - resultant file is corrupt

我有一个 .Net Core 3.1 Web API,它使用 AWS SDK 库将对象(PDF)从 Amazon S3 下载到磁盘。

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,我无法打开它 - 它已损坏。是编码问题吗?

对于任意二进制数据,字符串编码不可循环。也就是说,将任意 byte[] 数组视为 UTF8、ASCII 等编码文本,转换 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);
    }
}