我在服务器上有一个 pdf 文件(可能高达几 GB)。我想将它发送给客户端,以便客户端可以在他的本地计算机上下载它。我想我需要在 C# 中使用 Stream 类从 Web 服务器获取数据。但我不确定 Stream 类是否对它可以流式传输的文件大小有限制?
另外,一旦我有了数据流,如何将其发送给客户,以便他可以将其下载到本地计算机上?我们可以在 C# 中做到这一点吗?或者换句话说,如何将此数据流转换为可下载的文件?
我在服务器上有一个 pdf 文件(可能高达几 GB)。我想将它发送给客户端,以便客户端可以在他的本地计算机上下载它。我想我需要在 C# 中使用 Stream 类从 Web 服务器获取数据。但我不确定 Stream 类是否对它可以流式传输的文件大小有限制?
另外,一旦我有了数据流,如何将其发送给客户,以便他可以将其下载到本地计算机上?我们可以在 C# 中做到这一点吗?或者换句话说,如何将此数据流转换为可下载的文件?
应该注意的是,如果您使用 Web 服务器来发送文件,您可能不需要为它编写任何代码,Web 服务器具有内置的功能。
该类Stream
支持缓冲,这是您需要使用的。这是一个简单的例子:
byte[] buffer = new byte[1024]; // 1 KB buffer
using(FileStream fs = new FileStream("file.pdf"))
using(MemoryStream ms = new MemoryStream()) // output the stream into memory, this is what you'll want to change for your purposes
{
int read;
while((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
这个答案主要是关于从网络下载文件的客户端代码。
如果您需要服务器端代码 - ASP.Net MVC 已经有完美的方法 - Controller.File。
Stream
类对数据的大小没有限制(并且有无限的流,例如NetworkStream
)。个别实现可能对内部细节的大小有限制(即MemoryStream
受单个托管内存块的最大大小限制 - 略低于 2GB)
2GB 以下的文件根本不需要任何特殊编码,由于整数溢出和对单个托管内存块的最大大小的限制(即,如果尝试将 4GB 保存到MemoryStream
.
在大多数情况下,现有的类(如FileStream
)和方法(如Stream.CopyTo
)应该足以处理大文件。
还要检查现有的类WebClient.DownloadFile
是否对您足够:
WebClient myWebClient = new WebClient();
myStringWebResource = remoteUri + fileName;
myWebClient.DownloadFile(myStringWebResource, fileName);