2012-12-04 30 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

相关问题