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币余额
- 我的收藏
- 我的下载
- 下载帮助