我认为最好的方法是逐步下载文件并将其缓存到响应中,以逐步下载到客户端。这样,最终用户不必等待服务器完全下载文件并将其发回。它只会在从其他位置下载文件内容时传输文件内容。作为奖励,您不必将整个文件保存在内存中或磁盘上!
下面是一个代码示例实现这一目标:
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();
}
但是你把它,你仍然需要通过自己,你是最终的文件和最终用户之间的代理流。您是否能够在第一次流式传输时将文件存储在您自己的服务器上,然后随后的请求可以下载您保存的版本? – Darren
我可以存储该文件,但每个文件只能由单个用户下载一次,因此该选项中的实用程序很少。我只是希望加快这个过程。 – Andy