// Gera arquivos do disco rígido, fornece suporte para download de arquivos grandes, retoma o download, limite de velocidade e pequeno uso de recursos
//Parâmetros de entrada _Request: objeto Page.Request, _Response: objeto Page.Response, _fileName: nome do arquivo de download, _fullPath: caminho de download com nome do arquivo, _speed O número de bytes permitidos para download por segundo
//Retorna se foi bem-sucedido
public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed)
{
tentar
{
FileStream meuArquivo = novo FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = new BinaryReader(meuArquivo);
tentar
{
_Response.AddHeader("Intervalos de aceitação", "bytes");
_Response.Buffer = falso;
comprimento do arquivo longo = meuArquivo.Comprimento;
startBytes longos = 0;
pacote interno = 10240; //10K bytes
//int sleep = 200; //5 vezes por segundo, ou seja, 5*10K bytes por segundo
int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
if (_Request.Headers["Range"] != null)
{
_Response.StatusCode = 206;
string[] intervalo = _Request.Headers["Range"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(intervalo[1]);
}
_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
se (startBytes! = 0)
{
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Conexão", "Keep-Alive");
_Response.ContentType = "aplicativo/fluxo de octetos";
_Response.AddHeader("Disposição de conteúdo","anexo;nome do arquivo=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int maxCount = (int) Math.Floor((fileLength - startBytes) / pack) + 1
for (int i = 0; i < maxCount; i++)
{
se (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pacote));
Thread.Sleep(dormir);
}
outro
{
i=maxContagem;
}
}
}
pegar
{
retornar falso;
}
finalmente
{
br.Fechar();
meuArquivo.Close();
}
}
pegar
{
retornar falso;
}
retornar verdadeiro;
}
Exemplo de chamada
Page.Response.Clear();
bool sucesso = ResponseFile(Page.Request, Page.Response, "nome do arquivo", @"C:download.date", 1024000);
se(!sucesso)
Response.Write("Erro ao baixar arquivo!");
Page.Response.End();