// Вывод файлов на жесткий диск, поддержка загрузки больших файлов, возобновление загрузки, ограничение скорости и небольшое использование ресурсов.
//Входные параметры _Request: объект Page.Request, _Response: объект Page.Response, _fileName: имя файла загрузки, _fullPath: путь загрузки с именем файла, _speed Количество байт, разрешенное для загрузки в секунду
// Возврат в случае успеха
public static bool ResponseFile (HttpRequest _Request, HttpResponse _Response, строка _fileName, строка _fullPath, длинная _speed)
{
пытаться
{
FileStream myFile = новый FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = новый BinaryReader (myFile);
пытаться
{
_Response.AddHeader("Accept-Ranges", "bytes");
_Response.Buffer = ложь;
длинный fileLength = myFile.Length;
длинный startBytes = 0;
int Pack = 10240 //10 КБ;
//int Sleep = 200; //5 раз в секунду, то есть 5*10К байт в секунду
int Sleep = (int)Math.Floor(1000 * Pack/_speed) + 1;
если (_Request.Headers["Диапазон"] != ноль)
{
_Response.StatusCode = 206;
string[] range = _Request.Headers["Диапазон"].Split(новый символ[] {'=', '-'});
startBytes = Convert.ToInt64(диапазон[1]);
}
_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
если (startBytes!= 0)
{
_Response.AddHeader("Content-Range", string.Format(" байты {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Соединение", "Keep-Alive");
_Response.ContentType = "приложение/октет-поток";
_Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int) Math.Floor((fileLength - startBytes) /pack) + 1
для (int i = 0; i < maxCount; i++)
{
если (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(сон);
}
еще
{
я = maxCount;
}
}
}
ловить
{
вернуть ложь;
}
окончательно
{
br.Закрыть();
мойФайл.Закрыть();
}
}
ловить
{
вернуть ложь;
}
вернуть истину;
}
Пример вызова
Page.Response.Clear();
bool успех = ResponseFile(Page.Request, Page.Response, "имя файла", @"C:download.date", 1024000);
если(!успех)
Response.Write("Ошибка загрузки файла!");
Page.Response.End();