asp.net 几种文件下载方式比较

时间:2022-12-17 22:00:12
 

/*
     * asp.net 几种文件下载方式比较
     *
     * 方法1、HttpResponse.TransmitFile
     * 方法2、HttpResponse.WriteFile
     * 方法3、HttpResponse.BinaryWrite
     * 方法4、HttpResponse.Redirect
     *
     * 方法1与方法2
     *      相同点:都是通过文件的相对或绝对路径下载文件;
     *      不同点:方法2是一次性将文件读入内存,然后输出给客户端;
     *              方法1不在内存中缓冲文件。
     *        
     *      因此,对于大文件或用户数多的下载,方法1不会对于服务器内存的占用将远远低于方法2;
     *      这正是方法1的最大优势,
     *      但方法1也有一个局限:does not work with UNC-share file paths.     *     
     *      UNC (Universal Naming Convention) / 通用命名规则,也叫通用命名规范、通用命名约定。
     *      它符合 \servername\sharename 格式
     *      也就是说方法1无法下载网络共享磁盘的文件
     *     
     *      例如:
     *      if (filePath.StartsWith(@"\\")) 
     *          context.Response.WriteFile(filePath, false);
     *      else 
     *          context.Response.TransmitFile(filePath);
     *     
     * 方法3
     *      方法3主要是将已有的btye[] 型对象输出到客户端;
     *      如果要下载的文件位于数据库等存储介质,那么,读入内存时一般可放于DataTable等对象中,
     *      这时就可以直接HttpResponse.BinaryWrite((byte[])dt.Rows[0]["fileContent"])输出
     *
     * 方法4
     *      方法4主要是通过文件的相对路径下载文件;     *
     *
     *
     * 以上四个方法,如果下载一个汉字命名且字数超过20个字的文件
     * 方法1不会有问题;
     * 使用其它三个方法下载后,如果客户端在提示框中点“打开”将报错,提示文件名过长。
     *      
     */ 以下是测试用到的 download.aspx 及 download.cs的代码:

download.aspx

<%asp.net 几种文件下载方式比较@ Page Language="C#" AutoEventWireup="true" CodeFile="download.aspx.cs" Inherits="download" %>
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
asp.net 几种文件下载方式比较
<html xmlns="http://www.w3.org/1999/xhtml">
asp.net 几种文件下载方式比较
<head runat="server">
asp.net 几种文件下载方式比较    
<title></title>
asp.net 几种文件下载方式比较
</head>
asp.net 几种文件下载方式比较
<body>
asp.net 几种文件下载方式比较    
<form id="form1" runat="server">
asp.net 几种文件下载方式比较    
<div> <asp:Button ID="btnDownloadByRedirect" runat="server" 
asp.net 几种文件下载方式比较            Text
="using Response.Redirect()" onclick="btnDownloadByRedirect_Click"
asp.net 几种文件下载方式比较            
/>
asp.net 几种文件下载方式比较        
<asp:Button ID="btnDownloadByTransmitFile" runat="server" Text="using Response.TransmitFile()"
asp.net 几种文件下载方式比较            onclick
="btnDownloadByTransmitFile_Click" />
asp.net 几种文件下载方式比较        
<asp:Button ID="btnDownloadByWriteFile" runat="server" Text="using Response.WriteFile()"
asp.net 几种文件下载方式比较            OnClick
="btnDownloadByWriteFile_Click" />
asp.net 几种文件下载方式比较        
<asp:Button ID="btnDownloadByBinaryWrite" runat="server" Text="using Response.BinaryWrite()"
asp.net 几种文件下载方式比较            OnClick
="btnDownloadByBinaryWrite_Click"  />
asp.net 几种文件下载方式比较    
</div>
asp.net 几种文件下载方式比较    
</form>
asp.net 几种文件下载方式比较
</body>
asp.net 几种文件下载方式比较
</html>

download.cs 

using  System;
asp.net 几种文件下载方式比较
using  System.Collections.Generic;
asp.net 几种文件下载方式比较
using  System.Linq;
asp.net 几种文件下载方式比较
using  System.Web;
asp.net 几种文件下载方式比较
using  System.Web.UI;
asp.net 几种文件下载方式比较
using  System.Web.UI.WebControls;
asp.net 几种文件下载方式比较
using  System.IO;
asp.net 几种文件下载方式比较
using  System.Text;
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较
public   partial   class  download : System.Web.UI.Page
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较 {
asp.net 几种文件下载方式比较    
protected void Page_Load(object sender, EventArgs e)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
//System.Threading.Thread.Sleep(5000);
asp.net 几种文件下载方式比较        
//Download(HttpContext.Current.Response);
asp.net 几种文件下载方式比较
    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
protected void btnDownloadByRedirect_Click(object sender, EventArgs e)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        Download(HttpContext.Current.Response);
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
protected void btnDownloadByTransmitFile_Click(object sender, EventArgs e)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        Download(HttpContext.Current.Response, DownloadMethod.TransmitFile);
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
protected void btnDownloadByWriteFile_Click(object sender, EventArgs e)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        Download(HttpContext.Current.Response, DownloadMethod.WriteFile);
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
protected void btnDownloadByBinaryWrite_Click(object sender, EventArgs e)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        Download(HttpContext.Current.Response, DownloadMethod.BinaryWrite);
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private FileInfo info = null;
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private enum DownloadMethod
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        WriteFile,
asp.net 几种文件下载方式比较        BinaryWrite,
asp.net 几种文件下载方式比较        TransmitFile
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private bool PrepareFile()
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
string applicationPath = HttpContext.Current.Request.PhysicalApplicationPath;
asp.net 几种文件下载方式比较        
string lastCharacter = applicationPath.Substring(applicationPath.Length - 1);
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较        
if (!lastCharacter.Equals("\\"))
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较        
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较            applicationPath 
= applicationPath + "\\";
asp.net 几种文件下载方式比较        }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较        info 
= new FileInfo(applicationPath + "Files\\测试文件测试文件测试文件测试文件测试文件测.xls");        
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较        
return info.Exists;
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private byte[] GetFileByte()
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
return File.ReadAllBytes(info.FullName);
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private long GetFileLength()
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
return info.Length;
asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private void Download(HttpResponse response)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
if (PrepareFile())
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较        
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较            response.Redirect(
"Files/" + info.Name, true);
asp.net 几种文件下载方式比较        }

asp.net 几种文件下载方式比较    }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较    
private void Download(HttpResponse response, DownloadMethod method)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较    
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较        
if (PrepareFile())
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较        
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较            response.Clear();
asp.net 几种文件下载方式比较            response.ClearHeaders();
asp.net 几种文件下载方式比较            response.Buffer 
= false;
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较           
string displayName = HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(info.Name));
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较            response.AppendHeader(
"Content-Disposition""attachment;filename=" + displayName);
asp.net 几种文件下载方式比较            response.ContentType 
= "application/octet-stream";
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较            
switch (method)
asp.net 几种文件下载方式比较asp.net 几种文件下载方式比较            
asp.net 几种文件下载方式比较{
asp.net 几种文件下载方式比较                
case DownloadMethod.WriteFile:
asp.net 几种文件下载方式比较                    
//response.WriteFile(info.FullName);
asp.net 几种文件下载方式比较
                    response.TransmitFile("Files/" + info.Name);
asp.net 几种文件下载方式比较                    
break;
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较                
case DownloadMethod.BinaryWrite:
asp.net 几种文件下载方式比较                    response.BinaryWrite(GetFileByte());
asp.net 几种文件下载方式比较                    
break;
asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较                
case DownloadMethod.TransmitFile:
asp.net 几种文件下载方式比较                    
//response.TransmitFile(info.FullName);
asp.net 几种文件下载方式比较
                    response.TransmitFile("Files/" + info.Name);
asp.net 几种文件下载方式比较                    
break;
asp.net 几种文件下载方式比较            }

asp.net 几种文件下载方式比较
asp.net 几种文件下载方式比较            response.Flush();
asp.net 几种文件下载方式比较            response.End();
asp.net 几种文件下载方式比较        }
 
asp.net 几种文件下载方式比较    }