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

use*_*249 4 c# stream getresponsestream filestream responsestream

这就是场景.

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

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

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

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

我曾假设我想使用流来进行流式复制.例

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

inputStream.Flush();

Response.Flush();
Response.End();
Run Code Online (Sandbox Code Playgroud)

然而,这会将整个流复制到内存中,然后再将其写入客户端浏览器.任何想法都会很棒.

我需要我的服务器基本上只是充当代理并屏蔽原始文件位置

谢谢你的帮助.

use*_*249 5

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

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


Ale*_*kov 1

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

考虑使用异步版本的读/写,以及是否可以使用C# 4.0 中的async/awit来使代码可读。

旧方式:异步流处理,新方式异步文件 I/O