2013-06-20 125 views
3

我需要将通过Web服务获取的文件传递给最终用户。现在,我在两个步骤这样做:将文件从Web服务传递到ASP.NET中的客户端

昏暗的客户端作为新Net.WebClient client.Headers.Add(“授权”,字符串:

  1. 从安全的Web服务获取文件.Format( “承载{0}”,的access_token))

    昏暗数据作为字节()= client.DownloadData(URI)

  2. 经由http响应即成文件给用户。

这是花了很长时间的最终用户,因为用户必须等待服务器下载来自服务的文件,然后客户端从服务器下载文件。

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

+0

但是你把它,你仍然需要通过自己,你是最终的文件和最终用户之间的代理流。您是否能够在第一次流式传输时将文件存储在您自己的服务器上,然后随后的请求可以下载您保存的版本? – Darren

+0

我可以存储该文件,但每个文件只能由单个用户下载一次,因此该选项中的实用程序很少。我只是希望加快这个过程。 – Andy

回答

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(); 
    } 
+0

优秀。太棒了。 – Andy

相关问题