代码之家  ›  专栏  ›  技术社区  ›  Carbamate

如何通过rest api传输图像?(内部核心2.0)

  •  0
  • Carbamate  · 技术社区  · 8 年前

    我正在尝试用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错误:不可接受 . 我没什么想法了,所以我想问你能否帮我解决这个问题。提前谢谢你!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Chris Pratt    8 年前

    如果希望返回图像,则只需返回具有适当mimetype的字节。返回一个 OkResult 将导致您传入的任何对象被序列化,并将整个响应发送为 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");
    }