asp.net上传、下载常用方法
### ASP.NET中的文件上传与下载方法详解 在ASP.NET应用开发过程中,文件的上传与下载是常见的需求之一。本文将详细介绍几种常用的文件上传与下载的方法,并通过具体的代码示例进行说明。 #### 一、文件上传的基本原理 在Web应用程序中,用户通过表单提交文件时,通常使用`<input type="file" />`标签来选择文件。当用户提交表单后,这些文件会以二进制格式传输到服务器端。在ASP.NET中,可以利用`FileUpload`控件来处理这些文件。 #### 二、使用`FileUpload`控件上传文件 `FileUpload`控件是ASP.NET提供的用于文件上传的标准控件,它提供了丰富的属性和方法来处理文件上传操作。下面是一个简单的文件上传实现示例: ```csharp protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { string filePath = Server.MapPath("~/UploadedFiles/") + FileUpload1.FileName; FileUpload1.SaveAs(filePath); // 文件保存成功后的其他逻辑处理 } } ``` 这里的关键点在于`HasFile`属性判断是否选择了文件,以及`SaveAs`方法用于将上传的文件保存到指定路径。 #### 三、使用`Response.TransmitFile`下载文件 在ASP.NET中,可以使用`Response.TransmitFile`方法直接将文件发送给客户端。这种方法适用于较大的文件,因为它避免了先读取整个文件到内存中的过程,而是直接将文件流传输到客户端。 示例代码如下: ```csharp protected void DownloadFile_Click(object sender, EventArgs e) { string filePath = Server.MapPath("~/DownloadFiles/ExampleFile.pdf"); Response.Clear(); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filePath)); Response.TransmitFile(filePath); Response.End(); } ``` 此代码中,首先清空了响应对象的所有属性,然后设置了正确的MIME类型和文件名,最后使用`TransmitFile`方法直接传输文件。这种方式在处理大文件时效率较高。 #### 四、使用`Response.WriteFile`下载文件 除了`TransmitFile`外,还可以使用`Response.WriteFile`方法来下载文件。这种方法更适合于较小的文件,因为整个文件会被加载到内存中,然后再传输给客户端。 示例代码如下: ```csharp protected void DownloadFile_Click(object sender, EventArgs e) { string filePath = Server.MapPath("~/DownloadFiles/ExampleFile.pdf"); FileInfo fileInfo = new FileInfo(filePath); Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filePath)); Response.AddHeader("Content-Length", fileInfo.Length.ToString()); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType = "application/pdf"; Response.WriteFile(fileInfo.FullName); Response.Flush(); Response.End(); } ``` 这段代码中,使用了`FileInfo`类获取文件信息,并且设置了多个HTTP头部,最后调用`WriteFile`方法完成文件下载。 #### 五、分块下载文件 对于非常大的文件,可以采用分块下载的方式,以降低内存占用并提高传输效率。这种方式尤其适合网络不稳定或文件特别大的情况。 示例代码如下: ```csharp protected void DownloadLargeFile_Click(object sender, EventArgs e) { string filePath = Server.MapPath("~/DownloadFiles/LargeFile.zip"); const long ChunkSize = 1024 * 1024; // 每次读取1MB数据 byte[] buffer = new byte[ChunkSize]; Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filePath)); using (FileStream fileStream = File.OpenRead(filePath)) { int lengthRead; while ((lengthRead = fileStream.Read(buffer, 0, ChunkSize)) > 0 && Response.IsClientConnected) { Response.OutputStream.Write(buffer, 0, lengthRead); } } Response.End(); } ``` 在这个示例中,使用了一个循环来分批读取文件并写入到客户端,每次读取一定大小的数据块,直到文件全部传输完毕。 ### 总结 本文介绍了几种在ASP.NET中常用的文件上传与下载方法,包括使用`FileUpload`控件上传文件、使用`Response.TransmitFile`和`Response.WriteFile`下载文件以及如何实现分块下载等。每种方法都有其适用场景,开发者可以根据实际需求选择合适的方式来处理文件上传与下载功能。
详细参考运行维护、资源核查流程
//TransmitFile实现下载
//TransmitFile实现下载
protected void Button1_Click1(object sender, EventArgs e)
{
/*
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite
下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
代码如下:
*/
string strFileName = "三部闲置设备管理系统操作手册IEMS.ppt";
Response.ContentType = "application/x-zip-compressed";
//Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
string filename = BLL.Config.PART_EM_UPLOAD_DOC + strFileName;
//BLL.Config.PART_EM_UPLOAD_DOC 为路径 ("D:/EMUploadDoc/")
Response.AddHeader("Content-Disposition", "attachment;filename=" +Server.UrlPathEncode(strFileName));
//Server.UrlPathEncode()解决文件名的乱码问题.
Response.TransmitFile(filename);
} //WriteFile实现下载
protected void Button2_Click(object sender, EventArgs e)
{
/*
using System.IO;
*/
- xxy8807072012-12-24未能满足批量选择上传的需求,但是还是非常感谢这位仁兄的资源!
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于STM32为电子香味项目,通过蓝牙模块传输数据,嵌入式硬件平台,RFID使用的是RC522.整个项目包括软硬件以及android程序详细文档+全部资料+高分项目+源码.zip
- 基于发布-订阅模型的多线程消息框架,用于嵌入式平台,纯C实现,性能和灵活性极高详细文档+全部资料+高分项目+源码.zip
- 基于嵌入式Linux的一套可视对讲设备代码,比较底层,写的比较好,里面的lib库是一些图像处理库详细文档+全部资料+高分项目+源码.zip
- php 实现各种排序和查找算法源代码.zip
- 基于嵌入式qt的车载系统详细文档+全部资料+高分项目+源码.zip
- 基于嵌入式的基础图形库详细文档+全部资料+高分项目+源码.zip
- 基于嵌入式平台ARM Linux的新冠肺炎疫情监控平台详细文档+全部资料+高分项目+源码.zip
- 基于嵌入式的视觉运动控制详细文档+全部资料+高分项目+源码.zip
- 基于嵌入式综合项目:STM32F407基于ARM Cortex-M4处理器,云服务器Linux操作系统,MySQL数据存储转发详细文档+全部资料+高分项目+源码
- 基于热风控制系统嵌入式项目,基于STM32F1芯片和RT-Thread实时系统开发出温度闭环控制和风速控制详细文档+全部资料+高分项目+源码.zip
- 基于全志V3S的嵌入式开发者打怪升级项目详细文档+全部资料+高分项目+源码.zip
- 基于事件型嵌入式驱动框架。详细文档+全部资料+高分项目+源码.zip
- 基于使用B-Tree作为索引,基于MMap的嵌入式键值数据库详细文档+全部资料+高分项目+源码.zip
- 基于三个嵌入式的小项目:一个是基于科大讯飞的语音识别系统,一个是智能音乐相册,一个是别踩白块小游戏详细文档+全部资料+高分项目+源码.zip
- 基于物联网模式开发的嵌入式程序详细文档+全部资料+高分项目+源码.zip
- 基于以太网通信的电力电子设备运行状态的远程监控嵌入式系统设计详细文档+全部资料+高分项目+源码.zip