Donnerstag, Februar 27, 2020

Wie kann ich die bytes einer GetObjectResponse vom S3?

Bin ich abrufen einer Datei von Amazon S3. Ich möchte zum konvertieren der Datei in bytes, so dass ich es runterladen kann wie folgt:

var download = new FileContentResult(bytes, "application/pdf");
download.FileDownloadName = filename;
return download;

Ich habe die Datei hier:

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

Weiß ich um Antwort.WriteResponseStreamToFile (), aber ich möchte die Datei herunterladen zu den regulären Download-Ordner. Wenn ich konvertieren Sie die GetObjectResponse bytes, ich kann die Rückkehr der Datei. Wie kann ich dies tun?

4 Kommentare

  1. 18

    Hier ist die Lösung, die ich gefunden für alle anderen, die es braucht:

    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;
    }

    public static byte[] ReadStream(Stream responseStream)
    {
        byte[] buffer = new byte[16 * 1024];
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            return ms.ToArray();
        }
    }
  2. 12

    Nur noch eine Möglichkeit:

    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);
        }
    }    
    • Die ‚ResponseStream.CopyTo‘ ist sauberer als zu haben, um die create-Methode ‚ReadStream(Stream responseStream)‘ wie in der anderen Antwort. Auch können Sie ‚CopyToAsync‘ und machen die Methode async.
  3. 3

    Ich kämpfte, um die cleaner-Methode angeboten von Alex zu arbeiten (nicht sicher, was ich vermisst), aber ich wollte es tun w/o extra ReadStream Methode angeboten von Erica (obwohl es funktionierte)… hier ist, was ich aufgewickelt tun:

    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;
        }
  4. 0

    Stream jetzt mit asynchronen Methoden. In C# 8 können Sie dies tun:

    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();
    }

    Diese nicht blockieren alle threads, während die IO-Auftritt.

Kostenlose Online-Tests