// Genera archivos del disco duro, brinda soporte de descarga para archivos grandes, reanuda la descarga, límite de velocidad y uso de pequeños recursos
//Parámetros de entrada _Request: objeto Page.Request, _Response: objeto Page.Response, _fileName: nombre del archivo de descarga, _fullPath: ruta de descarga con el nombre del archivo, _speed El número de bytes permitidos para descargar por segundo
// Devuelve si fue exitoso
archivo de respuesta bool estático público (HttpRequest _Request, HttpResponse _Response, cadena _fileName, cadena _fullPath, larga _velocidad)
{
intentar
{
FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br = nuevo BinaryReader(miArchivo);
intentar
{
_Response.AddHeader("Aceptar-Rangos", "bytes");
_Response.Buffer = falso;
long fileLength = myFile.Length;
bytes de inicio largos = 0;
paquete int = 10240; //10Kbytes
//int sleep = 200; //5 veces por segundo, es decir, 5*10K bytes por segundo
int dormir = (int)Math.Floor(1000 * paquete/_velocidad) + 1;
si (_Request.Headers["Rango"]! = nulo)
{
_Respuesta.StatusCode = 206;
cadena[] rango = _Request.Headers["Rango"].Split(new char[] {'=', '-'});
startBytes = Convert.ToInt64(rango[1]);
}
_Response.AddHeader("Contenido-Longitud", (fileLength - startBytes).ToString());
si (startBytes! = 0)
{
_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
}
_Response.AddHeader("Conexión", "Keep-Alive");
_Response.ContentType = "aplicación/flujo de octeto";
_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) / paquete) + 1
para (int i = 0; i < maxCount; i++)
{
si (_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(paquete));
Thread.Sleep(dormir);
}
demás
{
i=cuentamáx;
}
}
}
atrapar
{
devolver falso;
}
finalmente
{
br.Cerrar();
miArchivo.Cerrar();
}
}
atrapar
{
devolver falso;
}
devolver verdadero;
}
Ejemplo de llamada
Page.Response.Clear();
bool Success = ResponseFile(Page.Request, Page.Response, "nombre de archivo", @"C:download.date", 1024000);
si(!éxito)
Response.Write("¡Error al descargar el archivo!")
;