C # MVC / API - вернуть изображение из Amazon S3 для моего вызова API - PullRequest
0 голосов
/ 19 сентября 2018

Я использую ядро ​​.net для загрузки и получения изображения из частного хранилища Amazon S3.

Я могу успешно загрузить его и даже просмотреть после загрузки с S3, однако, когда я немного не уверен в том, как вернуть поток / ответ обратно клиенту для реального APIвызов (например, сейчас я просто пытаюсь использовать прокси-инструменты Postman / Fiddler для получения изображения из моего API)

Мой код для S3 для получения потока:

///Retrieve my image from my bucket

public async Task<string> ReadObjectData(MediaFolder key, String fileName)
    {
        string responseBody = "";
        IAmazonS3 client;

        using (client = new AmazonS3Client(accessKey, accessSecret, endpoint))
        {
            Amazon.S3.Model.GetObjectRequest request = new Amazon.S3.Model.GetObjectRequest
            {
                BucketName = bucket,
                Key = key + "/" + fileName,
            };
            using (GetObjectResponse response = await client.GetObjectAsync(request))
            using (Stream responseStream = response.ResponseStream)
            using (StreamReader reader = new StreamReader(responseStream))
            {
                string title = response.Metadata["x-amz-meta-title"];
                responseBody = reader.ReadToEnd();
            }
        }
         return responseBody;
    }

Итак, теперь в моем контроллере у меня есть следующее действие:

   [HttpGet("ProfilePic")]
    public async Task<IActionResult> GetProfilePicture()
    {
        var user = await GetUserFromBearerToken();

        //Retrieve
        var utf8ImageResponse = await _fileService.ReadObjectData(MediaFolder.Profiles, user.ProfileImageFileName);

        //To return a file as a stream
        var imageBytes = System.Text.Encoding.UTF8.GetBytes(utf8ImageResponse);

        //Return the image, which I'll hardcode as jpeg for a test
        return File(imageBytes, "image/jpeg");
    }

Когда я звоню с помощью Почтальона, он возвращает маленькое пустое поле (поле, которое вы увидите, если попытаетесь вернуть изображение, но это не было допустимым изображением или каким-либо образом пустым).

Сейчас я использую Почтальон, но в идеале я бы хотел, чтобы приложение представляло это изображение.

Любые идеичто я делаю не так?Я пытался возиться с кодировкой base64 и другими вещами, но, похоже, ничего не работает.

Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Таким образом, вы можете извлечь файл как поток из S3 хранилища

public async Task<Stream> ReadObjectData(MediaFolder key, String fileName)
{
    try
    {
        using (var client = new AmazonS3Client(accessKey, accessSecret, endpoint))
        {
            var request = new GetObjectRequest
            {
                BucketName = bucket,
                Key = key + "/" + fileName
            };

            using (var getObjectResponse = await client.GetObjectAsync(request))
            {
                using (var responseStream = getObjectResponse.ResponseStream)
                {
                    var stream = new MemoryStream();
                    await responseStream.CopyToAsync(stream);
                    stream.Position = 0;
                    return stream;
                }
            }
        }
    }
    catch (Exception exception)
    {
        throw new Exception("Read object operation failed.", exception);
    }
}

А затем - вернуть этот поток как FileStreamResult:

[HttpGet("ProfilePic")]
public async Task<IActionResult> GetProfilePicture()
{
    var user = await GetUserFromBearerToken();

    Stream imageStream = await _fileService.ReadObjectData(MediaFolder.Profiles, user.ProfileImageFileName);

    Response.Headers.Add("Content-Disposition", new ContentDisposition
    {
        FileName = "Image.jpg",
        Inline = true // false = prompt the user for downloading; true = browser to try to show the file inline
    }.ToString());

    return File(imageStream, "image/jpeg");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...