C# MVC/API - 从 Amazon S3 为我的 API 调用返回图像

标签 c# asp.net-mvc asp.net-web-api amazon-s3 asp.net-core

我正在使用 .net core 从私有(private) 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;
    }

所以现在在我的 Controller 中,我有以下操作:

   [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");
    }

当我使用 Postman 进行调用时,它会返回一个小空白框(如果您尝试返回图像,您会看到该框,但它不是有效图像或在某种程度上为 null)。

现在我正在使用 Postman,但理想情况下我想要一个应用来呈现这张图片。

知道我做错了什么吗?我尝试搞乱 base64 编码和其他东西,但似乎没有任何效果。

谢谢!

最佳答案

这样你就可以从 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");
}

关于C# MVC/API - 从 Amazon S3 为我的 API 调用返回图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52412517/

相关文章:

c# - C# 命令提示的新手并试图理解此代码

c# - 构建包含 JavaScript 代码的 C# 字符串

asp.net-mvc - ASP.NET bundle - 包含文件更改或 bundle 结构更改后 bundle 未更新

c# - Asp.Net WebApi 上的自定义授权属性

c# - 在 WebAPI 帖子中发现了多项操作 - 为什么这不起作用?

mongodb - 我可以将 Breeze.js 与将 MongoDB 作为数据存储解决方案的 ASP.NET Web API 一起使用吗

c# - 从 asp.net 中的文本框中获取希伯来语字符

c# - 将实体集合转换为 Ilist,其中实体集合未实现 IEnumerable

c# - Asp.net 核心标识 "The INSERT statement conflicted with the FOREIGN KEY constraint "

asp.net-mvc - xVal 在 MVC 2 中已经过时了吗?