ASP.NET文件下载实现代码示例

1 下载量 144 浏览量 更新于2024-08-30 收藏 73KB PDF 举报
"asp.net实现文件下载的代码" 在ASP.NET中,文件下载是常见的功能需求,用于让用户能够从服务器获取文件。本文将介绍几种实现ASP.NET文件下载的方法,重点关注两种方式:使用`TransmitFile`和`WriteFile`。不过请注意,作者提到其中的第四种方法不推荐使用,但并未具体说明是哪种方法。 首先,我们来看使用`TransmitFile`的方法。`TransmitFile`是ASP.NET中的一个内建方法,它能高效地传输文件到客户端,适合大文件下载。以下是一个简单的示例: ```csharp public partial class FileDownLoad : System.Web.UI.Page { // 文件名需要进行URL编码,防止乱码 private string fileName = HttpContext.Current.Server.UrlEncode("规范.rar"); private string filePath = HttpContext.Current.Server.MapPath("规范.rar"); // 使用TransmitFile下载文件 protected void btnDL1_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; // 设置响应头 Response.Clear(); Response.ContentType = "application/x-zip-compressed"; // 根据文件类型设置 Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); // 指明Content-Length以便显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString()); // 通过TransmitFile方法传输文件 Response.TransmitFile(filePath, 0, fileSize); // 清空缓冲并关闭响应 Response.Flush(); Response.Close(); } } ``` 在这个例子中,当用户点击按钮`btnDL1`时,服务器会准备下载。`TransmitFile`方法直接从硬盘读取文件并发送到客户端,避免了加载到内存,从而节省了系统资源。 接下来,我们看看使用`WriteFile`的方法。这种方法适用于小文件,因为文件内容会被加载到内存然后再写入响应流: ```csharp // 使用WriteFile下载文件 protected void btnDL2_Click(object sender, EventArgs e) { FileInfo info = new FileInfo(filePath); long fileSize = info.Length; // 设置响应头 Response.Clear(); Response.ContentType = "application/octet-stream"; // 默认二进制流 Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); // 指明Content-Length以便显示下载进度 Response.AddHeader("Content-Length", fileSize.ToString()); // 打开文件流并写入响应流 using (FileStream fileStream = info.OpenRead()) { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0) { Response.BinaryWrite(buffer, 0, bytesRead); } } // 清空缓冲并关闭响应 Response.Flush(); Response.Close(); } ``` 在这个示例中,`WriteFile`实际上是通过循环读取文件,每次读取一定数量的字节(例如4096字节),然后写入响应流。这种方式虽然灵活性较高,但对大文件不适用,因为它可能导致内存占用过高。 需要注意的是,为了确保文件名在不同的操作系统和浏览器中正确显示,文件名需要进行URL编码。此外,设置`Content-Type`是为了告诉浏览器如何处理下载的文件,如"application/x-zip-compressed"表示ZIP压缩文件,"application/octet-stream"则表示通用的二进制数据。 在实际应用中,您可能还需要考虑其他因素,如错误处理、权限验证、下载进度提示等。在进行文件下载时,确保安全性和性能优化是至关重要的。