2012-12-04 31 views
3

我必須從磁盤或網絡鏈接中檢索圖像,調整其大小並將其流式傳輸到客戶端應用程序。這是我的控制器方法。如何在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; 
    } 

這是怎麼了發送的網頁鏈接(在這種情況下),並在客戶端應用程序結束接收圖像。

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"); 

的圖像從網頁鏈接檢索和調整大小得當,但如果它被proeprly流作爲它的創造與當客戶端應用程序收到「ImageName」一個0KB文件我不知道。任何人都可以告訴我哪裏錯了?我一直在敲打我的腦袋一下一整天:(

+0

客戶端流stream.Length的值是什麼 –

+0

零:(這就是爲什麼我認爲流處理沒有正確完成,但是當我把一個斷點放在「image.Save 「在控制器方法中,流顯示相當長的時間,這意味着圖像正被保存到流中。問題可能在於流沒有正確地連接到HttpContent或其他東西。有什麼建議麼? – Bitsian

+0

你在小提琴手中看到了什麼?服務器是否向響應流發送了一些內容? –

回答

3

嘗試重置內存流的位置,將它傳遞給響應之前:

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

我想,你的圖像縮放庫留下的位置最後的內存流

+0

非常感謝....救了我的一天:D – Bitsian

相關問題