我试图从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
,或者没有,但没有任何效果。< / p>
我已经看到here和here在回复正文流中写作是可行的,所以我认为我的方式很好(我已尝试过之前返回一个简单的字符串但不能正常工作。)
是的,我的base64字符串是正确的,因为我还尝试将其直接包含在HTML中,图像显示正确。
我确切地说,我不想使用任何JavaScript或Razor视图来实现这一点,只有纯HTML和我的控制器。
另外请注意我在API控制器中。我不能像我们在空的ASP.NET核心项目的Configure
类中的Startup
方法中看到的那样:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
即使两个回应&#39;类型为HttpResponse
,我的控制器中的类型没有任何Response.WriteAsync
但Response.Body.WriteAsync
感谢您的帮助,我已经花了好几个小时进行搜索,但对于ASP.NET Core几乎没有相关的资源
答案 0 :(得分:9)
你仍然将数据作为base64文本返回,基本上 - 你正在获得它的UTF-8编码形式,但就是这样。
如果你真的只有图像的base64版本,你只需解码:
byte[] image = Convert.FromBase64String(_base64Image2);
await Response.Body.WriteAsync(image, 0, image.Length);
(请注意,它只需要您转换的base64 - 而不是数据URI。)