protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["ID"] == null)
{
ResponseStr("参数错误!");
}
else
{
string fn = myCommon.FormatStr(Request.QueryString["ID"]);
if (fn == string.Empty || fn == "")
{
ResponseStr("参数错误!");
}
string strLocation = Server.MapPath("UploadFile") + "//" + HttpUtility.UrlEncode(fn, System.Text.Encoding.UTF8);
if (File.Exists(strLocation))
{
//防文件下载时直接打开的简单方式
//FileStream fileStream = new FileStream(strLocation, FileMode.Open);
//long fileSize = fileStream.Length;
//Response.ContentType = "application/octet-stream";
//Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fn, System.Text.Encoding.UTF8));
//Response.AddHeader("Content-Length", fileSize.ToString());
//byte[] fileBuffer = new byte[fileSize];
//fileStream.Read(fileBuffer, 0, (int)fileSize);
//fileStream.Close();
//Response.BinaryWrite(fileBuffer);
//Response.End();
//支持断点下载
FileStream fileStream = new FileStream(strLocation, FileMode.Open);
long fileSize = (long)fileStream.Length;
if (fileSize > 0)
{
try
{
Response.Clear();
long p = 0;
if (Request.Headers["Range"] != null)
{
Response.StatusCode = 206;
p = long.Parse(Request.Headers["Range"].Replace("bytes=", "").Replace("-", ""));
}
if (p != 0)
{
Response.AddHeader("Content-Range", "bytes " + p.ToString() + "-" + ((long)(fileSize - 1)).ToString() + "/" + fileSize.ToString());
}
Response.AddHeader("Content-Length", ((long)(fileSize - p)).ToString());
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fn, System.Text.Encoding.UTF8));
int maxLengthPerPackage = 51200; // 1024 * 50;
fileStream.Position = p;
long dataToRead = fileSize;
dataToRead = dataToRead - p;
while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
byte[] fileBuffer = new byte[maxLengthPerPackage];
int n = fileStream.Read(fileBuffer, 0, maxLengthPerPackage);
Response.OutputStream.Write(fileBuffer, 0, n);
//if (n == 0)
// break;
//if (n == maxLengthPerPackage)
//{
// Response.BinaryWrite(fileBuffer);
//}
//else
//{
// byte[] b = new byte[n];
// for (int i = 0; i < n; i++)
// {
// b[i] = fileBuffer[i];
// }
// Response.BinaryWrite(b);
//}
Response.Flush();
dataToRead = dataToRead - n;
}
else
{
dataToRead = -1;
}
}
}
catch (Exception ex)
{
ResponseStr("Error : " + ex.Message);
}
finally
{
if (fileStream != null)
{
fileStream.Close();
}
}
}
if (fileStream != null)
{
fileStream.Close();
}
Response.End();
}
else
{
ResponseStr("该文件不存在!");
}
}
}