【发布时间】: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,是否在字符串中但没有任何效果。
我已经看到 here 和 here 在 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