【问题标题】:ASP.NET Core API Controller: Response.Body.WriteAsync base64 string not workingASP.NET Core API 控制器:Response.Body.WriteAsync base64 字符串不起作用
【发布时间】:2017-02-21 00:35:52
【问题描述】:

我正在尝试从 API 控制器返回一个表示 jpeg 图像的 base64 字符串,并将其设置为 <img> 的 src,但我所有的尝试都失败了。

这是非常简单的 HTML:

<img src="/api/TestBase64Image" alt="image test" />

还有我的控制器:

[Route("api/[controller]")]
public class TestBase64ImageController : Controller
{
    private const string _base64Image = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg.....";
    private const string _base64Image2 = "/9j/4AAQSkZJRgABAQEBLAEsAAD/7Sfg.....

    [HttpGet]
    public async Task Get()
    {
        Response.ContentType = "image/jpeg";
        //Response.ContentType = "text/plain";
        //Response.ContentType = new MediaTypeHeaderValue("image/jpeg").ToString();
        //Response.ContentType = new MediaTypeHeaderValue("text/plain").ToString();

        //Response.Headers.Add("Content-Length", _base64Image.Length.ToString());
        //HttpContext.Response.ContentLength = _base64Image.Length;

        await Response.Body.WriteAsync(Encoding.UTF8.GetBytes(_base64Image), 0, _base64Image.Length);
        //await Response.Body.FlushAsync();
    }
}

我尝试了几件事,例如删除FlushAsync(),更改定义ContentType 的方式,包括data:image/jpeg;base64,是否在字符串中但没有任何效果。

我已经看到 herehere 在 Response 正文流中写入是可行的,所以我认为我的方法不错(我之前尝试过返回一个简单的字符串,但效果不佳)。

是的,我的 base64 字符串是正确的,因为我也尝试将它直接包含到 HTML 中并且图像正确显示。

我确实不想使用任何 JavaScript 或 Razor 视图来实现这一点,只有纯 HTML 和我的控制器。

另外请注意我在 API 控制器中。我不能像我们在空 ASP.NET Core 项目的 Startup 类中的 Configure 方法中看到的那样做同样的事情,例如:

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello World!");
});

尽管两种响应的类型都是HttpResponse,但我的控制器中没有Response.WriteAsync,而是Response.Body.WriteAsync

感谢您的帮助,我已经搜索了几个小时,但对于 ASP.NET Core 几乎没有关于此的资源

【问题讨论】:

  • 为什么在请求时尝试返回 base64 图像? base64 数据 URI 的要点是将数据嵌入 HTML 中。对于常规的图像提取,您应该直接返回二进制数据。
  • 我处于将图像作为 base64 字符串的上下文中,我没有任何物理文件可供服务。但这不是我在做什么,使用Encoding.UTF8.GetBytes 返回二进制数据吗?我迷路了,因为在旧的 ASP.NET(非 MVC)中,我使用 Response.BinaryWrite 做到了这一点,但在 Core 中没有这样的事情......
  • 作为记录,您的控制器代码没有“Response.WriteAsync()”的原因是因为您没有包含具有所需扩展方法的命名空间。 ;) 将using Microsoft.AspNetCore.Http; 添加到您的控制器页面,它将在那里。提示:如果您键入扩展方法名称,VS 将尝试通过快速操作提示为您解析它。
  • 我遇到了类似的问题,解决方案奏效了!只需从“管理 NuGet 包”添加包,然后安装:Microsoft.AspNetCore.Http.Abstractions“version = 1.1.2”(在我的情况下)。最后在源代码中,我添加了:using Microsoft.AspNetCore.Http;感谢您的帮助!

标签: c# image asp.net-core base64 asp.net-core-webapi


【解决方案1】:

基本上,您仍然以 base64 文本的形式返回数据 - 您得到的是 UTF-8 编码形式,但仅此而已。

如果你真的只有base64版本的图片,你只需要解码:

byte[] image = Convert.FromBase64String(_base64Image2);
await Response.Body.WriteAsync(image, 0, image.Length);

(请注意,它必须是您转换的 base64 - 而不是数据 URI。)

【讨论】:

  • 哇,解决方案如此简单,我想知道我是怎么错过的......超级快速的答案,非常感谢乔恩。 (WriteAsync也在等offsetlength,我让你编辑你的答案……)
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2017-02-21
  • 2018-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多