昨天做文件下载时,发现图片文件和文本文件总是会在页面里面打开而不是弹出下载对话框,于是在网上找了很久,最终自己写了一个。
public void DownMaxFile(string filePath,string showFileName)

{
int bufferSize = 10000, length = 0;
long dataToRead, startBytes = 0;
Stream iStream = null;

byte[] buffer = new Byte[bufferSize];
string filename = Path.GetFileName(filePath);

//查看是否是断点续传请求
if (Request.Headers["Range"] != null)

{
Response.StatusCode = 206;

string[] range = Request.Headers["Range"].Split(new char[]
{ '=', '-' });
startBytes = Convert.ToInt64(range[1]);
}

try

{
iStream = new FileStream(filePath, FileMode.Open,FileAccess.Read, FileShare.Read);
dataToRead = iStream.Length;

if (startBytes != 0)

{
Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, dataToRead - 1, dataToRead));
}
Response.AddHeader("Accept-Ranges", "bytes");
Response.AddHeader("Content-Length", (dataToRead - startBytes).ToString());
Response.AddHeader("Connection", "Keep-Alive");
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(showFileName, System.Text.Encoding.UTF8));

while (dataToRead > 0)

{
if (Response.IsClientConnected)

{
length = iStream.Read(buffer, 0, bufferSize);
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new Byte[bufferSize];
dataToRead = dataToRead - length;
}
else

{
dataToRead = -1;
}
}
}
catch (Exception ex)

{
Response.Write("Error : " + ex.Message);
}
finally

{
if (iStream != null)

{
iStream.Close();
}
Response.Close();//重要
}

}