我在服务器上有一个pdf文件(可能高达几gb)。我想把它发送给客户端,这样客户端可以在他的本地机器上下载。我想我需要在c#中使用流类来从web服务器获取数据。但我不确定流类是否对它可以流的文件大小有限制?
还有,一旦我有了数据流,我如何将其发送到客户端,以便他可以在他的本地机器上下载?我们可以在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);
}
}
这个答案主要是关于客户端代码从web下载文件。
如果你需要服务器端代码- 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);