web-dev-qa-db-ja.com

ASP.NET Core APIコントローラー:Response.Body.WriteAsync base64文字列が機能しない

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 bodyストリームへの書き込みが可能であることを確認したので、私は順調に進んでいると思います(以前の文字列ですが、機能しません)。

はい、base64文字列は正しいです。HTMLに直接含めようとしても、画像が正しく表示されるからです。

正確には、JavaScriptまたはRazorビューを使用してそれを実現するのではなく、純粋なHTMLとコントローラーのみを使用します。

また、APIコントローラーの内部にいることにも注意してください。次のように、空のASP.NET CoreプロジェクトのConfigureクラスのStartupメソッドで見られるのと同じことはできません。

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

両方の応答のタイプはHttpResponseですが、コントローラーのタイプには_Response.WriteAsync_がありませんが、_Response.Body.WriteAsync_はありません

あなたの助けをありがとう、それは私が探している時間でしたが、ASP.NET Coreのためにこれについてまだほとんどリソースがありません

9
Jérôme MEVEL

基本的には、データをbase64テキストとして返します。つまり、UTF-8でエンコードされた形式のデータを取得していますが、それだけです。

実際にbase64バージョンのイメージしかない場合は、それをデコードする必要があります。

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

(データURIではなく、変換するbase64である必要があることに注意してください。)

12
Jon Skeet