首页 > 解决方案 > 如何通过 REST API 传输图像?(内有Core 2.0)

问题描述

我正在尝试使用 ASP.NET Core 2.0 创建身份验证应用程序,并且正在尝试创建一些 REST 方法。我想要做的是创建一个返回配置文件图像的 GET 方法。我懂了:

[Produces("application/json")]
public class UserController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

    public UserProfileController(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    [HttpGet]
    public async Task<IActionResult> GetPicture(string username)
    {
        var user = await _userManager.FindByNameAsync(username);

        return Ok(user.Picture);
    }
}

它确实有效。事实上,调用此方法会返回我的图像的 base64 字符串表示形式。但我想要的是获得图像本身。然后,我尝试将GetPicture方法更改为:

    [HttpGet]
    public async Task<IActionResult> GetPicture(string username)
    {
        var user = await _userManager.FindByNameAsync(username);

        var bytes = Convert.FromBase64String(user.Picture);
        Image image;
        using (var ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }
        return Ok(image);
    }

但它并没有像我希望的那样工作。我认为这是内容类型的问题,所以我尝试将其更改[Produces("application/json")[Produces("image/jpeg")或类似的东西。但它不起作用,因为它给了我一个406 Error: Not Acceptable。我的想法不多了,所以我问你是否可以帮助我解决这个问题。先感谢您!

标签: c#asp.net-core-mvc

解决方案


如果您想要返回图像,则只需返回具有适当 mimetype 的字节。返回 anOkResult将导致您传入的任何对象都被序列化,并将整个响应发送为application/json,这显然不是图像。这就是你所需要的:

[HttpGet]
public async Task<IActionResult> GetPicture(string username)
{
    var user = await _userManager.FindByNameAsync(username);
    var bytes = Convert.FromBase64String(user.Picture);
    return File(bytes, "image/jpeg");
}

推荐阅读