如果想通用的话,建议还要做一步处理就是一些下载工具的下载拦截,比如下载EXE或者RAR文件经常会被迅雷等下载工具拦截掉,导致了无法正常弹出下载对话框,有关这方面的文章可以看下:
http://www.cnblogs.com/smjack/archive/2009/02/26/1398748.html
附一个我一直用的通用方法:
/// <summary>
/// 执行文件下载
/// </summary>
/// <param name="FullFileName">位于服务器上要下载的绝对文件路径</param>
/// <param name="page">page对象</param>
/// <param name="clientFileName">下载到客户端的文件名</param>
public static void ExecDataDownload(string FullFileName, Page page, string clientFileName)
{
if(string.IsNullOrEmpty(FullFileName))
{
throw new ArgumentNullException("输入了空的文件名!");
}
if(page == null)
{
throw new ArgumentNullException("未提供Page对象!");
}
string fileName = FullFileName;
FileInfo info = new FileInfo(fileName);
if(string.IsNullOrEmpty(clientFileName))
{
clientFileName = info.Name;
}
if(info.Exists)
{
FileStream f = new FileStream(FullFileName, FileMode.Open);
byte[] buffer = new byte[f.Length];
f.Read(buffer, 0, buffer.Length);
f.Close();
page.Response.Clear();
page.Response.AppendHeader("Content-Disposition", "Attachment;FileName=" + HttpUtility.UrlEncode(clientFileName));
page.Response.AppendHeader("Content-Length", info.Length.ToString());
page.Response.ContentType = "application/octet-stream";
page.Response.TransmitFile(info.FullName);
page.Response.BinaryWrite(buffer);
page.Response.End();
page.Response.Close();
}
else
{
string[] array = fileName.Split(new char[] { '\\' });
Array.Reverse(array);
throw new Exception("要下载的文件[" + array[0] + "]不存在!");
}
}
不过如果客户端机器上安装了迅雷等下载软件,会被迅雷等拦截,可以结合上面的链接进行处理