C# 通过我的服务器将文件从远程服务器复制到客户端浏览器,而无需将整个文件写入磁盘或内存

C# 通过我的服务器将文件从远程服务器复制到客户端浏览器,而无需将整个文件写入磁盘或内存,c#,stream,filestream,getresponsestream,responsestream,C#,Stream,Filestream,Getresponsestream,Responsestream,情况就是这样 远程文件服务器上有一个文件(假设我在DropBox上托管了一个文件) 我想在我的web应用程序(c#asp.net 4.0)上下载该文件 我想100%隐藏原始文件的位置(我希望它看起来像来自我的服务器) 我不想将此文件写入服务器上的内存或磁盘 我假设我想使用流到流的复制。范例 Stream inputStream = response.GetResponseStream(); inputStream.CopyTo(Response.OutputStream, 4096); inp

情况就是这样

远程文件服务器上有一个文件(假设我在DropBox上托管了一个文件)

我想在我的web应用程序(c#asp.net 4.0)上下载该文件

我想100%隐藏原始文件的位置(我希望它看起来像来自我的服务器)

我不想将此文件写入服务器上的内存或磁盘

我假设我想使用流到流的复制。范例

Stream inputStream = response.GetResponseStream();
inputStream.CopyTo(Response.OutputStream, 4096);

inputStream.Flush();

Response.Flush();
Response.End();
但是,这会在将整个流写入客户端浏览器之前将其复制到内存中。任何想法都会很棒

我需要我的服务器基本上只是作为一个代理和屏蔽原始文件的位置


谢谢您的帮助。

虽然我不明白为什么
CopyTo
会在内存中读取整个流(因为任何地方都没有中间流),但您可以手动编写相同的副本,以确保它的行为符合您的要求

考虑使用异步版本的读/写,如果可以使用C#4.0中的
Async
/
awit
使代码可读


旧方法:,新方法

以下代码就是我最终得到的(缓冲区大小将在生产中更改) 这将从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();
            }

这可以通过我的服务器传输任意大小的文件,而无需等待我的服务器先将其存储到内存或磁盘上。真正的优点是它使用的内存非常少,因为只存储缓冲块。对于客户端,下载立即开始。(这对大多数人来说可能是显而易见的,但对于这个新手来说非常酷)因此我们同时从一个位置下载文件,并使用服务器作为代理将其上载到另一个位置。

您不能只是混淆url。没有办法做到这一点,这样可以很好地扩展。@bumble\u bee\u tuna,代理服务器的扩展非常好-特别是在无状态的情况下-只要添加您需要的服务器就可以了。这是一个很大的帮助。我将用完成的代码回复,以防其他人需要这样做。CopyTo不是问题所在。嗯,有点。事实上,在写入整个流之前,响应对象不会被刷新。我必须从头开始创建这个方法,以便在每个块之后添加刷新流。