Для нового окна, которое открывается во время загрузки и которое необходимо закрыть после загрузки: оно эффективно для файлов меньшего размера:
System.IO.FileInfo file = new System.IO.FileInfo("F:\mp3\mp3\Не плачь, мой любимый человек.mp3");
Ответ.Очистить();
Response.ClearHeaders();
Ответ.Буфер = ложь;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("Не плачь, мой любимый человек.mp3"));
Response.AddHeader("Content-Length", file.Length.ToString());
Response.WriteFile(file.FullName);
Ответ.Смыв();
Ответ.Конец();
Этот код может вывести файл и закрыть вновь открытую форму.
Для больших файлов не лучше использовать приведенный выше код, поскольку приведенный выше код выводится после кэширования всех файлов на сервере. Если на вашем сервере большой трафик и файл большой, не рекомендуется использовать описанный выше метод. .
Я протестировал следующее, и, похоже, оно работает лучше:
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 = (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;
}
}
_Response.Flush();
}
ловить
{
вернуть ложь;
}
окончательно
{
br.Закрыть();
мойФайл.Закрыть();
}
}
ловить
{
вернуть ложь;
}
вернуть истину;
}
Этот вид кода также доступен в Интернете. Он также может выводить файлы и закрывать вновь открывшуюся оконную форму.
Кроме того, в ходе теста было обнаружено, что могут произойти некоторые непредвиденные вещи, если операционные системы сервера и клиента. Вообще говоря, использование Если приведенный выше код не может быть закрыт нормально, вы можете проверить настройки браузера в разделе «Дополнительно».
Кроме того, вы можете изменять различные типы выходного контента Response.ContentType = "application/octet-stream"; поскольку разные типы контента могут интерпретироваться по-разному на стороне клиента.
Если у вас есть идеи, пожалуйста, ответьте. Обсуждения приветствуются.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html