C#编程:实现从服务器高效下载文件
"这篇文章主要介绍了如何使用C#语言从服务器下载文件,包括两种不同的实现方法:TransmitFile和WriteFile。" 在C#编程中,从服务器下载文件是常见的网络操作,尤其在Web应用程序中。这里我们将探讨两种常用的方法:`Response.TransmitFile()` 和 `Response.WriteFile()`。 首先,`Response.TransmitFile()` 方法是一种高效的方式来发送大文件到客户端,如在标题和描述中提到的。这个方法直接将文件从硬盘传输到客户端浏览器,减少了内存占用。以下是一个使用`TransmitFile()`的示例: ```csharp protected void Button1_Click(object sender, EventArgs e) { // 设置响应的Content-Type和Content-Disposition Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=z.zip"); // 获取服务器上的文件路径 string filename = Server.MapPath("DownLoad/z.zip"); // 使用TransmitFile发送文件到客户端 Response.TransmitFile(filename); } ``` 在这个例子中,当用户点击按钮时,服务器将“z.zip”文件作为附件发送,客户端浏览器通常会提示用户保存这个文件。 另一种方法是使用 `Response.WriteFile()`。这种方法允许你有更多的控制,例如设置编码或者添加自定义的头部信息。下面是使用`WriteFile()`的例子: ```csharp protected void Button2_Click(object sender, EventArgs e) { // 定义文件名和服务器上的文件路径 string fileName = "asd.txt"; string filePath = Server.MapPath("DownLoad/aaa.txt"); // 清理响应内容 Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); // 添加头部信息,包括Content-Disposition、Content-Length和Content-Type Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); Response.AddHeader("Content-Length", new FileInfo(filePath).Length.ToString()); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType = "application/octet-stream"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); // 使用WriteFile写入文件内容到响应流 Response.WriteFile(filePath); } ``` 在这个例子中,`WriteFile()` 方法读取指定文件的内容并将其写入HTTP响应流。这使得你可以设置更多自定义的HTTP头部信息,如文件长度、编码等。 总结来说,C# 提供了两种从服务器下载文件的方法,各有其适用场景。`TransmitFile()` 更适合大文件传输,因为它避免了加载整个文件到内存中。而 `WriteFile()` 则提供了更多的灵活性,可以处理更复杂的文件传输需求。在实际应用中,开发者应根据项目需求选择合适的方法。
一、//TransmitFile实现下载
protected void Button1_Click(object sender, EventArgs e)
{
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("Content-Disposition", "attachment;filename=z.zip");
string filename = Server.MapPath("DownLoad/z.zip");
Response.TransmitFile(filename);
}
二、//WriteFile实现下载
protected void Button2_Click(object sender, EventArgs e)
{
/*
using System.IO;
*/
string fileName = "asd.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}
三、 //WriteFile分块下载
protected void Button3_Click(object sender, EventArgs e)
{
string fileName = "aaa.txt";//客户端保存的文件名
string filePath = Server.MapPath("DownLoad/aaa.txt");//路径
System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
if (fileInfo.Exists == true)
{
const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
剩余8页未读,继续阅读
- 粉丝: 0
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- WebLogic集群配置与管理实战指南
- AIX5.3上安装Weblogic 9.2详细步骤
- 面向对象编程模拟试题详解与解析
- Flex+FMS2.0中文教程:开发流媒体应用的实践指南
- PID调节深入解析:从入门到精通
- 数字水印技术:保护版权的新防线
- 8位数码管显示24小时制数字电子钟程序设计
- Mhdd免费版详细使用教程:硬盘检测与坏道屏蔽
- 操作系统期末复习指南:进程、线程与系统调用详解
- Cognos8性能优化指南:软件参数与报表设计调优
- Cognos8开发入门:从Transformer到ReportStudio
- Cisco 6509交换机配置全面指南
- C#入门:XML基础教程与实例解析
- Matlab振动分析详解:从单自由度到6自由度模型
- Eclipse JDT中的ASTParser详解与核心类介绍
- Java程序员必备资源网站大全