C# 如何从S3获取GetObjectResponse的字节?

C# 如何从S3获取GetObjectResponse的字节?,c#,amazon-web-services,amazon-s3,download,byte,C#,Amazon Web Services,Amazon S3,Download,Byte,我正在从AmazonS3检索一个文件。我想将文件转换为字节,以便按如下方式下载: var download = new FileContentResult(bytes, "application/pdf"); download.FileDownloadName = filename; return download; 我这里有文件: var client = Amazon.AWSClientFactory.CreateAmazonS3Client( accessKey,

我正在从AmazonS3检索一个文件。我想将文件转换为字节,以便按如下方式下载:

var download = new FileContentResult(bytes, "application/pdf");
download.FileDownloadName = filename;
return download;
我这里有文件:

var client = Amazon.AWSClientFactory.CreateAmazonS3Client(
        accessKey,
        secretKey,
        config
        );
GetObjectRequest request = new GetObjectRequest();
GetObjectResponse response = client.GetObject(request);          

我知道response.writeResponseStreamTable(),但我想将该文件下载到常规下载文件夹。如果将GetObjectResponse转换为字节,则可以返回该文件。我如何才能做到这一点?

以下是我为其他需要它的人找到的解决方案:

GetObjectResponse response = client.GetObject(request);
using (Stream responseStream = response.ResponseStream)
{
    var bytes = ReadStream(responseStream);
    var download = new FileContentResult(bytes, "application/pdf");
    download.FileDownloadName = filename;
    return download;
}

只是另一种选择:

Stream rs;    
using (IAmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client())
{
    GetObjectRequest getObjectRequest = new GetObjectRequest();
    getObjectRequest.BucketName = "mybucketname";
    getObjectRequest.Key = "mykey";

    using (var getObjectResponse = client.GetObject(getObjectRequest))
    {
              getObjectResponse.ResponseStream.CopyTo(rs);
    }
}    

我努力让Alex提供的更干净的方法发挥作用(不确定我遗漏了什么),但我想在没有Erica提供的额外ReadStream方法的情况下实现它(尽管它起了作用)。。。以下是我最后要做的:

var s3Client = new AmazonS3Client(AccessKeyId, SecretKey, Amazon.RegionEndpoint.USEast1);
    using (s3Client)
    {
        MemoryStream ms = new MemoryStream();
        GetObjectRequest getObjectRequest = new GetObjectRequest();
        getObjectRequest.BucketName = BucketName;
        getObjectRequest.Key = awsFileKey;

        using (var getObjectResponse = s3Client.GetObject(getObjectRequest))
        {
            getObjectResponse.ResponseStream.CopyTo(ms);
        }
        var download = new FileContentResult(ms.ToArray(), "image/png"); //"application/pdf"
        download.FileDownloadName = ToFilePath;
        return download;
    }

现在有异步方法。在C#8中,您可以执行以下操作:

public async Task<byte[]> GetAttachmentAsync(string objectPointer)
{
    var objReq = new GetObjectRequest
    {
        BucketName = "bucket-name",
        Key = objectPointer,    // the file name
    };

    using var objResp = await _s3Client.GetObjectAsync(objReq);
    using var ms = new MemoryStream();
    await objResp.ResponseStream.CopyToAsync(ms, _ct);  // _ct is a CancellationToken
    return ms.ToArray();
}
公共异步任务GetAttachmentAsync(字符串对象指针) { var objReq=新的GetObjectRequest { BucketName=“bucket name”, Key=objectPointer,//文件名 }; 使用var objResp=await _s3Client.GetObjectAsync(objReq); 使用var ms=new MemoryStream(); wait objResp.ResponseStream.CopyToAsync(ms,_-ct);/\u-ct是一个取消令牌 返回ToArray女士(); }
这不会在IO发生时阻止任何线程。

与在其他应答中创建方法“ReadStream(Stream ResponseStream)”相比,“ResponseStream.CopyTo”更干净。您还可以使用“CopyToAsync”并使方法异步。当我从同步方法调用它时,我对它的行为有点困惑。
public async Task<byte[]> GetAttachmentAsync(string objectPointer)
{
    var objReq = new GetObjectRequest
    {
        BucketName = "bucket-name",
        Key = objectPointer,    // the file name
    };

    using var objResp = await _s3Client.GetObjectAsync(objReq);
    using var ms = new MemoryStream();
    await objResp.ResponseStream.CopyToAsync(ms, _ct);  // _ct is a CancellationToken
    return ms.ToArray();
}