3

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

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

    将客户端调暗为新 Net.WebClient client.Headers.Add("Authorization", String.Format("Bearer {0}", access_token))

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

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

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

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

4

1 回答 1

5

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

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

    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();
    }
于 2013-06-20T13:54:23.203 回答