web-dev-qa-db-fra.com

Comment renvoyer une image avec la méthode Get API Web

Je dois renvoyer une image avec une méthode Get API Web. Le code ci-dessous semble bien fonctionner, sauf que le message suivant apparaît dans la fenêtre ImageView du Fiddler: "Cette réponse est codée mais ne prétend pas être une image."

public HttpResponseMessage Get()
{
    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        HttpResponseMessage response = new HttpResponseMessage(); 
        response.Content = new StreamContent(fs);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
        return response;
    }
} 

Je vois le même résultat dans le Fiddler avec ce code aussi:

public HttpResponseMessage Get()
{
    HttpResponseMessage response = new HttpResponseMessage();
    Byte[] b = (GetImageByteArray());
    response.Content = new ByteArrayContent(b);
    response.Content.LoadIntoBufferAsync(b.Length).Wait();
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
    return response;
}

J'obtiens le même résultat si j'utilise le format .png.

Apprécier ton aide,

25
J.D.

Si je comprends bien, vous demandez spécifiquement à asp.net core. Dans ASP.net core, HttpResponseMessage n’est pas un moyen de renvoyer un résultat comme nous le faisions auparavant dans ASP.net Web Api 2.

Dans asp.net core (WEB API), ressemblez simplement à ceci.

[HttpGet]
public IActionResult Get()
{            
    Byte[] b = System.IO.File.ReadAllBytes(@"E:\\Test.jpg");   // You can use your own method over here.         
    return File(b, "image/jpeg");
}

Remarque: lorsque vous mentionnez que dans Fiddler Imageview, le message suivant apparaît: "sa réponse est codée, mais ne prétend pas être une image". parce que le noyau ASP.net considère HttpResponseMessage comme une classe simple et le convertit en json ou xml.

35
dotnetstep

C’est ainsi que j’ai l’image de l’API dans mon projet. Je partage pour qui concerne.

Contenu de l'image enregistré dans le dossier Images du serveur et nom de l'image enregistré dans la base de données.

[Route("api/dashboard/GetImage")]
public byte[] GetImage(int componentId)
{
            using (var dashboardService = new DashboardService())
            {
                var component = dashboardService.GetImage(componentId);
                var context = HttpContext.Current;
                string filePath = context.Server.MapPath("~/Images/" + component.ImageName);
                context.Response.ContentType = "image/jpeg";
                using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        fileStream.CopyTo(memoryStream);
                        Bitmap image = new Bitmap(1, 1);
                        image.Save(memoryStream, ImageFormat.Jpeg);

                        byte[] byteImage = memoryStream.ToArray();
                        return byteImage;
                    }
                }
            }
}

Obtenir le contenu de l'image en angulaire

this.dashboardService.getImage(this.componentId)
    .subscribe((blob: any) => {
      let objectURL = 'data:image/jpeg;base64,' + blob;
      this.imageUrl = this.sanitizer.bypassSecurityTrustUrl(objectURL);;
});
2
Hien Nguyen

Ajout de cette réponse parce que ces commentaires sont faciles à manquer (comme je l'ai presque fait).

Proposé par Jussi Palo (en utilisant un PhysicalFileResult):

[HttpGet]
public IActionResult Get()
{        
    return PhysicalFile(@"E:\\Test.jpg", "image/jpeg");
}
  • Une belle doublure qui gère des choses comme 206 partielles.

Suggéré par Tseng (en utilisant une surcharge du constructeur FileContentResult qui accepte un flux):

[HttpGet]
public IActionResult Get()
{        
    FileStream stream = File.Open(@"E:\\Test.jpg");
    return File(stream, "image/jpeg");
}
  • Utile si votre flux provient d'ailleurs (comme une ressource intégrée).

Pour RL, n'oubliez pas de vérifier que le fichier/la ressource existe, et renvoyer 404 sinon.

0
Mark