gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:53:34 24 4
gpt4 key购买 nike

这是场景。

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

我想在我的 Web 应用程序 (c# asp.net 4.0) 上提供该文件作为下载

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

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

我曾假设我想使用流来流式复制。例子

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

inputStream.Flush();

Response.Flush();
Response.End();

然而,这会在将其写出到客户端浏览器之前将整个流复制到内存中。任何想法都会很棒。

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

感谢您的帮助。

最佳答案

以下代码是我最终得到的(缓冲区大小会在生产中改变)这从一个 url 获取一个文件,并开始通过我的服务器将它逐 block 流式传输到客户端。我花了一点时间才弄清楚的部分是在写入每个 block 后刷新响应。

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

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

关于c# - 通过我的服务器将文件从远程服务器复制到客户端浏览器,而不将整个文件写入磁盘或内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com