web-dev-qa-db-fra.com

Contrôleur API ASP.NET Core: la chaîne Response.Body.WriteAsync base64 ne fonctionne pas

J'essaie de retourner une chaîne base64 représentant une image jpeg à partir d'un contrôleur API et de la définir comme le src d'un <img> Mais toutes mes tentatives ont échoué.

Voici le HTML très simple:

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

Et mon contrôleur:

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

J'ai essayé plusieurs choses, comme supprimer FlushAsync(), changer la façon de définir le ContentType, inclure data:image/jpeg;base64, Dans la chaîne ou non mais rien ne fonctionne.

J'ai vu ici et ici que l'écriture dans le flux du corps de réponse est faisable, donc je suppose que je suis sur la bonne voie (j'ai essayé de retourner un simple chaîne avant mais ne fonctionne pas aussi bien).

Oui, ma chaîne base64 est correcte car j'ai également essayé de l'inclure directement dans le HTML et l'image s'affiche correctement.

Je précise que je ne veux utiliser aucune vue JavaScript ou Razor pour y parvenir, uniquement du HTML pur et mon contrôleur.

Veuillez également faire attention à ce que je sois dans un contrôleur API. Je ne peux pas faire la même chose que nous voyons dans la méthode Configure dans la classe Startup d'un projet ASP.NET Core vide comme:

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

Même si les deux types de réponses sont HttpResponse, celui de mon contrôleur n'a pas de Response.WriteAsync Mais Response.Body.WriteAsync

Merci pour votre aide, cela fait des heures que je recherche mais il n'y a presque pas encore de ressources à ce sujet pour ASP.NET Core

9
Jérôme MEVEL

Vous renvoyez toujours les données sous forme de texte base64, en gros - vous obtenez la forme encodée en UTF-8, mais c'est tout.

Si vous n'avez vraiment que la version base64 de l'image, il vous suffit de la décoder:

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

(Notez qu'il doit s'agir uniquement de la base64 que vous convertissez - pas de l'URI de données.)

12
Jon Skeet