c# - 如何在 asp.net web api 中将图像流式传输到客户端应用程序?

标签 c# asp.net asp.net-mvc streaming asp.net-web-api

我必须从磁盘或 Web 链接中检索图像,调整其大小并将其流式传输到客户端应用程序。这是我的 Controller 方法。

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

正在从 Web 链接检索图像并且调整大小已正确完成,但我不确定它是否被正确地流式传输,因为它在客户端应用程序接收到时创建了一个带有“ImageName”的 0kb 文件。谁能告诉我哪里出了问题?我整天都在为这件事苦苦思索 :(

最佳答案

在将内存流传递给响应之前尝试重置内存流的位置:

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

我想你的图像大小调整库将内存流的位置留在最后。

关于c# - 如何在 asp.net web api 中将图像流式传输到客户端应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13697315/

相关文章:

c# - 获取 DataGridView 中选定行的单元格内容

c# - 从 HttpModule 访问 Request.Form 中断 AutoEventWireUp

c# - 人员选取器控件在 asp.net mvc 应用程序中的实现

asp.net - 覆盖 JqGrid 编辑/删除按钮 CSS 类

c# - 当使用参数重定向到另一个操作时,属性变为 NULL

C#在计时器停止后停止事件处理程序

java - Xamarin.Android 中的后台执行

c# - 覆盖 Unity3D 内置的 CharacterController

javascript - AngularJs 将查询字符串发布到 C# Controller

jquery - 将作用域 css 应用于动态创建的 jquery ui datepicker