2016-10-12 11 views
3

APIコントローラからjpegイメージを表すbase64文字列を返して、<img>のsrcとして設定しようとしていますが、すべての試みが失敗しました。 。 data:image/jpeg;base64が含まれ、私は、FlushAsync()を削除ContentTypeを定義する方法を変更するように、いくつかのことを試してみたASP.NET Core APIコントローラ:Response.Body.WriteAsync base64文字列が動作しない

[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(); 
    } 
} 

<img src="/api/TestBase64Image" alt="image test" /> 

そして、私のコントローラ:ここ

は非常に単純なHTMLです文字列内にあるかどうかはわかりませんが、何も動作していません。

私はhereとレスポンスボディストリームに書き込みをなんとかですhereを見てきましたので、私は、私は良い方法によ推測(私は前に、単純な文字列を返すようにしようとしたが、同様に作業していませんでした)。

はい私のbase64文字列も正しいです。私はHTMLに直接組み込み、画像が正しく表示されているためです。

正確には、JavaScriptやRazorビューを使用して純粋なHTMLとコントローラのみを使用したいとは限りません。

また、私はAPIコントローラの中にいるので注意してください。我々のような空のASP.NETコアプロジェクトのStartupクラスにConfigure方法で見ると、私は同じことを行うことはできません。

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

両方の応答のタイプはHttpResponse、doesnの私のコントローラ内の一つであるにもかかわらず、 「tはあなたの助けのための任意のResponse.WriteAsyncしかしResponse.Body.WriteAsync

感謝を持って、それは私が探してる時間をされているが、これについてほとんどのリソースは、あなたがまだBASE64としてデータを返しているASP.NETコア

+0

要求があったときにbase64イメージを返そうとしているのはなぜですか? base64データURIのポイントは、HTML内にデータを埋め込むことです。通常のイメージフェッチの場合は、バイナリデータを直接返す必要があります。 –

+0

私は画像をbase64文字列として扱うことになっているため、物理ファイルを用意する必要はありません。しかし、私がやっていることではなく、 'Encoding.UTF8.GetBytes'を使ってバイナリデータを返していますか?古いASP.NET(非MVC)では 'Response.BinaryWrite'を使用していましたが、コアにはこのようなことはありませんので、私はこれを行う方法を失いました... –

+2

あなたのコントローラコードの理由必要な拡張メソッドで名前空間を含めなかったため、 "Response.WriteAsync()"がありません。 ;)あなたのコントローラページに 'Using Microsoft.AspNetCore.Http;'を追加すると、そこに表示されます。ヒント:拡張メソッド名を入力すると、VSはクイックアクションプロンプトでそれを解決しようとします。 –

答えて

3

のためにまだありますテキスト、基本的に - あなたはUTF-8でエンコードされた形式を取得していますが、t帽子のすべて。

あなたが本当に唯一の画像のbase64でバージョンを持っている場合、あなたはちょうどそれをデコードする必要があります。

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

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

+0

うわー、ソリューションがとてもシンプルだったので、私はそれを逃したのだろうかと思っています...超高速応答、ありがとうジョン。 ( 'WriteAsync'も' offset'と 'length'を待っています、私はあなたの答えを編集させます...) –

+0

@JérômeMével:ありがとう、ありがとう。 –

関連する問題