/// <summary>
/// 下载的方法
/// </summary>
/// <param name="filepath">下载文件的路径</param>
public void Reget(string filepath)
{
System.IO.Stream iStream = null;
// 分块读取,每块10K bytes
byte[] buffer = new Byte[10240];
//文件的大小
int length;
// 文件的字节数
long dataToRead;
// 得到文件名
string filename = System.IO.Path.GetFileName(filepath);
try
{
Response.Clear();
Response.ClearHeaders();
//打开文件
iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
System.IO.FileAccess.Read, System.IO.FileShare.Read);
// 总字节
dataToRead = iStream.Length;
long p = 0;
if (Request.Headers["Range"] != null)
{
//如果是续传请求,则获取续传的起始位置,即已经下载到客户端的字节数
Response.StatusCode = 206; //重要:续传必须,表示局部范围响应。
p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
}
if (p != 0)
{
//不是从最开始下载,
//响应的格式是:Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long)(dataToRead - 1)).ToString() + "/" + dataToRead.ToString());
}
Response.AddHeader("Connection", "Keep-Alive");
Response.AddHeader("Content-Length", ((long)(dataToRead - p)).ToString());
Response.ContentType = "application/octet-stream"; //MIME类型:匹配任意文件类型
Response.AddHeader("Content-Disposition", "attachment; filename=" + System.Web.HttpUtility.UrlEncode(Request.ContentEncoding.GetBytes(filename)));
iStream.Position = p;
dataToRead = dataToRead - p;
// 读字节
while (dataToRead > 0)
{
//确认客户端连接
if (Response.IsClientConnected)
{
// Read the data in buffer.
length = iStream.Read(buffer, 0, 10240);
// Write the data to the current output stream.
Response.OutputStream.Write(buffer, 0, length);
// Flush the data to the HTML output.
Response.Flush();
buffer = new Byte[10240];
dataToRead = dataToRead - length;
}
else
{
//prevent infinite loop if user disconnects
dataToRead = -1;
}
}
}
catch (Exception ex)
{
// Trap the error, if any.
Response.Write("Error : " + ex.Message);
}
finally
{
if (iStream != null)
{
//关闭流
iStream.Close();
}
Response.End();
}
}
对于这个方法,我做过测试,不过太大的文件(大于1G)下载就出现问题,各位要是有什么办法可以解决或有什么更好的方法的话可以写下。