2012-12-04 1 views
3

Je dois récupérer une image à partir du disque ou d'un lien Web, la redimensionner et la diffuser vers l'application cliente. C'est ma méthode de contrôleur.Comment diffuser une image vers une application cliente dans asp.net web api?

[HttpPost] 
    [ActionName("GetImage")] 
    public HttpResponseMessage RetrieveImage(ImageDetails details) 
    { 
     if (!details.Filename.StartsWith("http")) 
     { 
      if (!FileProvider.Exists(details.Filename)) 
      { 
       throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound, "File not found")); 
      } 

      var filePath = FileProvider.GetFilePath(details.Filename); 

      details.Filename = filePath; 
     }     

     var image = ImageResizer.RetrieveResizedImage(details); 

     MemoryStream stream = new MemoryStream(); 

     // Save image to stream. 
     image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);   

     var response = new HttpResponseMessage(); 
     response.Content = new StreamContent(stream); 
     response.Content.Headers.ContentDisposition 
      = new ContentDispositionHeaderValue("attachment"); 
     response.Content.Headers.ContentDisposition.FileName = details.Filename; 
     response.Content.Headers.ContentType 
      = new MediaTypeHeaderValue("application/octet-stream"); 

     return response; 
    } 

Et c'est ainsi que je suis l'envoi du lien Web (dans ce cas) et la réception de l'image à l'extrémité de l'application cliente.

HttpClient client = new HttpClient(); 
      client.BaseAddress = new Uri("http://localhost:27066"); 
      client.DefaultRequestHeaders.Accept.Add(
       new MediaTypeWithQualityHeaderValue("application/octet-stream")); 

      ImageDetails img = new ImageDetails { Filename = "http://2.bp.blogspot.com/-W6kMpFQ5pKU/TiUwJJc8iSI/AAAAAAAAAJ8/c3sJ7hL8SOw/s1600/2011-audi-q7-review-3.jpg", Height = 300, Width = 200 }; 

      var response = await client.PostAsJsonAsync("api/Media/GetImage", img); 
      response.EnsureSuccessStatusCode(); // Throw on error code. 

      var stream = await response.Content.ReadAsStreamAsync(); 

      FileStream fileStream = System.IO.File.Create("ImageName"); 
      // Initialize the bytes array with the stream length and then fill it with data 
      byte[] bytesInStream = new byte[stream.Length]; 
      stream.Read(bytesInStream, 0, (int)bytesInStream.Length);  
      // Use write method to write to the specified file 
      fileStream.Write(bytesInStream, 0, (int) bytesInStream.Length); 



      MessageBox.Show("Uploaded"); 

L'image est extraite à partir du lien Web et le redimensionnement est fait correctement, mais ne sais pas si son transmis en ligne proeprly comme la création d'un fichier 0kb avec « ImageName » lors de la réception à l'application client. Quelqu'un peut-il me dire où je vais mal? Je suis frappais ma tête à ce sujet toute la journée :(

+0

Quelle est la valeur de 'stream.Length' sur le client? –

+0

zéro :(c'est pourquoi je pense que le streaming n'est pas fait correctement.Mais quand je mets un point d'arrêt à" image.Save "Dans la méthode du contrôleur, le flux affiche une longueur considérable, ce qui signifie que l'image est enregistrée dans le flux. stream n'est pas attaché au HttpContent correctement ou autre chose. Aucune suggestion? – Bitsian

+0

Que voyez-vous dans Fiddler? Le serveur a-t-il envoyé quelque chose dans le flux de réponse? –

Répondre

3

Essayez de réinitialiser la position du flux de mémoire avant de passer à la réponse:

stream.Position = 0; 
response.Content = new StreamContent(stream); 

Je suppose que votre bibliothèque de redimensionnement d'image quitte la position de le flux de la mémoire à la fin

+0

Merci beaucoup .... sauvé ma journée: D – Bitsian

Questions connexes