Para una nueva ventana que se abre durante la descarga y debe cerrarse después de la descarga: es efectivo para archivos más pequeños:
Archivo System.IO.FileInfo = new System.IO.FileInfo("F:\mp3\mp3\No llores mi persona favorita.mp3");
Respuesta.Clear();
Respuesta.ClearHeaders();
Respuesta.Buffer = falso;
Response.Charset="GB2312";
Response.ContentEncoding=System.Text.Encoding.UTF8;
Response.ContentType = "aplicación/flujo de octeto";
Response.AddHeader("Content-Disposition", "attachment; filename="+Server.UrlEncode("No llores, mi persona favorita.mp3"));
Response.AddHeader("Contenido-Longitud", file.Length.ToString());
Response.WriteFile(archivo.FullName);
Respuesta.Flush();
Respuesta.End();
Este código puede generar el archivo y cerrar el formulario recién abierto.
Para archivos grandes, no es mejor usar el código anterior, porque el código anterior se genera después de que todos los archivos se almacenen en caché en el servidor. Si su servidor tiene mucho tráfico y el archivo es grande, no se recomienda utilizar el método anterior. .
He probado lo siguiente y parece funcionar mejor:
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 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;
}
}
_Respuesta.Flush();
}
atrapar
{
devolver falso;
}
finalmente
{
br.Cerrar();
miArchivo.Cerrar();
}
}
atrapar
{
devolver falso;
}
devolver verdadero;
}
Este tipo de código también está disponible en Internet. También puede generar archivos y cerrar el formulario de ventana recién abierto.
Además, durante la prueba, se descubrió que sucederán algunas cosas inesperadas si los sistemas operativos del servidor y del cliente. son diferentes en términos generales, si el código anterior no se puede cerrar normalmente, puede verificar la configuración del navegador en Avanzado.
Además, puede modificar diferentes tipos de contenido de salida Response.ContentType = "application/octet-stream" porque los diferentes tipos de contenido pueden interpretarse de manera diferente en el lado del cliente.
Si tiene alguna idea, responda. Las discusiones son bienvenidas.
http://www.cnblogs.com/tour-code/archive/2006/10/25/539257.html