以下代码是我最终得到的(缓冲区大小将在生产中发生变化)这会从 url 获取文件,并开始通过我的服务器将其逐块流式传输到客户端。我花了一点时间才弄清楚的部分是在写入每个块后刷新响应。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(digitalAsset.FullFilePath);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Response.ClearHeaders();
Response.ClearContent();
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" + digitalAsset.FileName);
Stream inputStream = response.GetResponseStream();
byte[] buffer = new byte[512];
int read;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, read);
Response.Flush();
}
Response.End();
}
这可以通过我的服务器流式传输任何大小的文件,而无需等待我的服务器将其存储到内存或磁盘中。真正的优势是它使用的内存非常少,因为只存储了缓冲的块。对于客户端,下载立即开始。(这对大多数人来说可能很明显,但对于这个新手来说非常酷)所以我们同时从一个位置下载文件并使用服务器作为一种代理将其上传到另一个位置。