【问题标题】:Passing file from web service to client in ASP.NET在 ASP.NET 中将文件从 Web 服务传递到客户端
【发布时间】:2013-06-20 13:02:20
【问题描述】:

我需要将通过 Web 服务获得的文件传递给最终用户。现在,我分两步进行:

  1. 从安全的网络服务获取文件:

    Dim 客户端作为新的 Net.WebClient client.Headers.Add("Authorization", String.Format("Bearer {0}", access_token))

    将数据调暗为 Byte() = client.DownloadData(uri)

  2. 通过 http 响应将文件提供给用户。

这对最终用户来说需要很长时间,因为用户必须等待服务器从服务下载文件,然后客户端从服务器下载文件。

是否可以将文件直接从 Web 服务流式传输给用户?如果是这样,最好的方法是什么?

【问题讨论】:

  • 无论您如何剪裁,您仍然需要通过自己进行流式传输,因为您最终是文件和最终用户之间的代理。您是否无法在第一次流式传输文件时将文件存储在您自己的服务器上,然后后续请求可以下载您保存的版本?
  • 我可以存储文件,但每个文件可能只能由单个用户下载一次,因此该选项中的实用程序很少。我只是希望加快这个过程。

标签: c# asp.net .net vb.net


【解决方案1】:

我认为实现这一点的最佳方法是逐步下载文件并将其缓冲到响应中,以便逐步下载到客户端。这样,最终用户不必等待服务器完全下载文件并将其发回。它只会在从其他位置下载文件内容时流式传输文件内容。作为奖励,您不必将整个文件保存在内存或磁盘中!

这是实现此目的的代码示例:

    protected void downloadButton_Click(object sender, EventArgs e)
    {
        Response.Clear();
        Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "MyFile.exe"));
        Response.Buffer = true;
        Response.ContentType = "application/octet-stream";

        using (var downloadStream = new WebClient().OpenRead("http://otherlocation.com/MyFile.exe")))
        {
            var uploadStream = Response.OutputStream;
            var buffer = new byte[131072];
            int chunk;

            while ((chunk = downloadStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                uploadStream.Write(buffer, 0, chunk);
                Response.Flush();
            }
        }

        Response.Flush();
        Response.End();
    }

【讨论】:

  • 优秀。这是完美的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多