2010-02-02 6 views
5

Tengo que desencadenar descargas de archivos de gran tamaño a un navegador web, donde creo el archivo para transferirlo al servidor y luego lo elimino inmediatamente. He encontrado suficientes ejemplos para ver que probablemente debería utilizar Response.TransmitFile o Response.WriteFile ... pero he oído que hay problemas con ambos:WriteFile vs TransmitFile para archivos de gran tamaño que deben eliminarse del servidor después de la transferencia

WriteFile es síncrono, pero almacena el archivo en memoria antes de enviarlo para el usuario. Como estoy lidiando con archivos muy grandes, esto podría causar problemas.

TransmitFile no almacena en búfer localmente, por lo que funciona para archivos grandes, pero es asíncrono, por lo que no puedo eliminar el archivo después de llamar a TransmitFile. Aparentemente, descargar el archivo no garantiza que pueda eliminarlo tampoco?

¿Cuál es la mejor forma de lidiar con esto?

También está la BinaryWrite ... ¿podría recorrer un flujo de archivos, copiándolo en segmentos?

Respuesta

0

Podría comprometer el archivo en el disco (nombre aleatorio, etc.) y comenzar a enviar, pero agregar una entrada a una tabla DB con el nombre de archivo temporal, después de un período de tiempo que defina, haga que un trabajo de limpieza atraviese esos DB entradas, y eliminar el archivo del disco si se ha agotado.

2

escritura de archivo es sincrónico, pero amortigua el archivo en la memoria antes de enviarlo al usuario. Como soy que trata con archivos muy grandes, este podría causar problemas.

Creo que puede deshabilitar el almacenamiento en búfer en WriteFile configurando Response.BufferOutput = false;

Una vez que esto se ha establecido en false usted debe ser capaz de llamar sin búfer de escritura de archivo ...

0

WriteFile método se utiliza para descargar el pequeño archivo desde el servidor, el parámetro de tamaño debe estar entre cero y el valor máximo de Int32, antes de transferir el archivo, almacena el archivo en la memoria. El método TransmitFile se utiliza para descargar el archivo grande del servidor y no almacena en búfer el archivo en la memoria. Pero cuando intenta eliminar el archivo mientras se descarga, arroja la excepción. A continuación se muestra el código que eliminaría el archivo después de descargarlo.

FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate); 
     MemoryStream ms = new MemoryStream(); 
     fs.CopyTo(ms); 
     context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip"); 
     context.Response.ContentType = "application/octet-stream"; 
     context.Response.BinaryWrite(ms.ToArray()); 
     fs.Close(); 
     File.Delete(@"D:\FileDownLoad\DeskTop.zip"); 
Cuestiones relacionadas