C# 如何在asp.net web api中将图像流式传输到客户端应用程序?
我必须从磁盘或web链接中检索图像,调整其大小并将其流式传输到客户端应用程序。这是我的控制器方法C# 如何在asp.net web api中将图像流式传输到客户端应用程序?,c#,asp.net,asp.net-mvc,streaming,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Streaming,Asp.net Web Api,我必须从磁盘或web链接中检索图像,调整其大小并将其流式传输到客户端应用程序。这是我的控制器方法 [HttpPost] [ActionName("GetImage")] public HttpResponseMessage RetrieveImage(ImageDetails details) { if (!details.Filename.StartsWith("http")) { if (!FileProvide
[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;
}
这就是我在客户端应用程序端发送web链接(在本例中)和接收图像的方式
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");
正在从web链接检索图像,并已正确调整大小,但不确定其是否在客户端应用程序接收时以流式传输,因为它正在创建一个带有“ImageName”的0kb文件。谁能告诉我哪里出了问题?我整天都在为这个问题绞尽脑汁:(在将内存流传递给响应之前,请尝试重置内存流的位置:
stream.Position = 0;
response.Content = new StreamContent(stream);
我假设您的图像大小调整库将内存流的位置保留在末尾。客户端上的
stream.Length
的值是多少?零:(这就是为什么我认为流未正确完成的原因。但是当我在“image.Save”处设置断点时)在控制器方法中,流显示了相当长的长度,这意味着图像正在保存到流中。问题可能是流没有正确地附加到HttpContent或其他内容。有什么建议吗?您在Fiddler中看到了什么?服务器是否向响应流发送了一些内容?