2016-10-12 4 views
3

Ich versuche, eine Base64-Zeichenfolge, die ein JPEG-Bild von einem API-Controller und legte es als die src von <img>, aber alle meine Versuche fehlgeschlagen . HierASP.NET-Core-API-Controller: Response.Body.WriteAsync base64-Zeichenfolge funktioniert nicht

ist die sehr einfache HTML:

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

Und mein Controller:

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

ich mehrere Dinge ausprobiert habe, wie FlushAsync() zu entfernen, die Änderung der Art und Weise der ContentType zu definieren, umfassen data:image/jpeg;base64 , in der Kette oder nicht, aber nichts funktioniert.

Ich habe here und here gesehen, dass das Schreiben in den Response-Body-Stream machbar ist, also nehme ich an, dass ich auf dem guten Weg bin (ich habe versucht, einen einfachen String vorher zurückzugeben, aber auch nicht funktioniert).

Ja meine Base64-Zeichenfolge ist korrekt, weil ich auch versucht habe, es direkt in den HTML-Code einzuschließen, und das Bild wird korrekt angezeigt.

Ich präzis Ich möchte keine JavaScript oder Razor View verwenden, um das zu erreichen, nur reines HTML und mein Controller.

Bitte beachten Sie auch, dass ich in einem API-Controller bin. Ich kann nicht das gleiche tun, wie wir in der Configure Methode in der Klasse Startup eines leeren ASP.NET Core-Projekt wie sehen:

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

Obwohl beide Antworten Typen sind HttpResponse, die in meinem Controller doesn ‚t haben alle Response.WriteAsync aber Response.Body.WriteAsync

Danke für Ihre Hilfe, es Stunden, die ich bin auf der Suche, aber es gibt so gut wie keine Ressourcen darüber noch für ASP.NET-Core

+0

Warum versuchen Sie, ein Base64-Bild zurückzugeben, wenn es angefordert wird? Der Punkt der base64-Daten-URIs besteht darin, die Daten in den HTML-Code einzubetten. Für einen normalen Image-Abruf sollten Sie die Binärdaten direkt zurückgeben. –

+0

Ich bin in einem Zusammenhang mit dem Bild als Base64 String, ich habe keine physische Datei zu bedienen. Aber ist es nicht, was ich mache, binäre Daten mit 'Encoding.UTF8.GetBytes' zurückgebend? Ich bin den Weg, dies zu tun, weil in alten ASP.NET (nicht-MVC) habe ich das mit "Response.BinaryWrite", aber es gibt keine solche Sache in Core ... –

+2

Für den Rekord, der Grund, Ihren Controller-Code hat "Response.WriteAsync()" nicht, weil Sie den Namespace NICHT mit der erforderlichen Erweiterungsmethode aufgenommen haben. ;) Füge 'using Microsoft.AspNetCore.Http;' zu deiner Controller-Seite hinzu und es wird dort sein. TIPP: Wenn Sie den Namen der Erweiterungsmethode eingeben, versucht VS, diesen mit der Schnellaktionsaufforderung für Sie aufzulösen. –

Antwort

3

Du bist immer noch die Daten als base64-Rückkehr Text, im Grunde - Sie erhalten die UTF-8-kodierte Form davon, aber t Das ist alles.

Wenn Sie wirklich nur die Version des Bildes base64 haben, müssen Sie nur, dass dekodieren müssen:

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

(. Beachten Sie, dass es nur die base64 sein muss Sie konvertieren - nicht die Daten URI)

+0

Wow, die Lösung war so einfach, ich frage mich, wie ich das verpasst habe ... Super schnelle Antwort, vielen Dank Jon. ('WriteAsync' wartet auch auf den 'Offset' und die 'Länge', ich lasse Sie Ihre Antwort bearbeiten ...) –

+0

@ JérômeMével: Fertig, danke. –

Verwandte Themen