ASP.NET 核心 API 控制器:Response.Body.WriteAsync base64 字符串无效
ASP.NET Core API Controller: Response.Body.WriteAsync base64 string not working
我正在尝试 return 表示来自 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 and 在响应主体流中写入是可行的,所以我认为我的方法很好(我之前尝试 return 一个简单的字符串但是效果不佳)。
是的,我的 base64 字符串是正确的,因为我还尝试将它直接包含到 HTML 中,并且图像正确显示。
我准确地说我不想使用任何 JavaScript 或 Razor 视图来实现这一点,只有纯粹的 HTML 和我的控制器。
另请注意,我在 API 控制器中。我不能像我们在空 ASP.NET 核心项目的 Startup
class 中的 Configure
方法中看到的那样做,例如:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
尽管两种响应类型都是 HttpResponse
,但我控制器中的响应类型没有任何 Response.WriteAsync
,而是 Response.Body.WriteAsync
感谢您的帮助,我搜索了好几个小时,但几乎没有关于 ASP.NET Core
的资源
您仍然以 base64 文本形式返回数据,基本上 - 您得到的是它的 UTF-8 编码形式,但仅此而已。
如果你真的只有 base64 版本的图像,你只需要对其进行解码:
byte[] image = Convert.FromBase64String(_base64Image2);
await Response.Body.WriteAsync(image, 0, image.Length);
(请注意,它需要只是您转换的 base64,而不是数据 URI。)
我正在尝试 return 表示来自 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 and
是的,我的 base64 字符串是正确的,因为我还尝试将它直接包含到 HTML 中,并且图像正确显示。
我准确地说我不想使用任何 JavaScript 或 Razor 视图来实现这一点,只有纯粹的 HTML 和我的控制器。
另请注意,我在 API 控制器中。我不能像我们在空 ASP.NET 核心项目的 Startup
class 中的 Configure
方法中看到的那样做,例如:
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
尽管两种响应类型都是 HttpResponse
,但我控制器中的响应类型没有任何 Response.WriteAsync
,而是 Response.Body.WriteAsync
感谢您的帮助,我搜索了好几个小时,但几乎没有关于 ASP.NET Core
的资源您仍然以 base64 文本形式返回数据,基本上 - 您得到的是它的 UTF-8 编码形式,但仅此而已。
如果你真的只有 base64 版本的图像,你只需要对其进行解码:
byte[] image = Convert.FromBase64String(_base64Image2);
await Response.Body.WriteAsync(image, 0, image.Length);
(请注意,它需要只是您转换的 base64,而不是数据 URI。)