ASP.Core API控制器:Response.Body.WriteAsync base64字符串不工作

本文关键字:base64 WriteAsync 字符串 工作 Body Response Core API 控制器 ASP | 更新日期: 2023-09-27 18:12:37

我试图从API控制器返回一个base64字符串,代表jpeg图像,并将其设置为<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,在字符串中或不是,但没有任何工作。

我在这里和这里看到在响应体流中写作是可行的,所以我认为我是在一个好方法上(我之前试图返回一个简单的字符串,但不工作)。

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

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

还请注意,我是在一个API控制器。我不能像我们在空ASP的Startup类的Configure方法中看到的那样做。. NET Core项目,如:

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

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

谢谢你的帮助,我已经搜索了几个小时了,但是几乎没有关于ASP的资源。网络核心

ASP.Core API控制器:Response.Body.WriteAsync base64字符串不工作

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

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

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

(注意,它只需要是要转换的base64 -而不是数据URI)