2009-05-08 9 views
5

Estoy intentando crear un método que fluye continuamente un archivo zip como un usuario descarga que (por lo que no hay transmisión de desperdicio)MVC.NET comenzar a descargar

he añadido un Thread.Sleep a simular latencia

public override void ExecuteResult(ControllerContext context) { 
    HttpResponseBase response = context.HttpContext.Response; 

    response.Clear(); 
    response.ClearContent(); 
    response.ClearHeaders(); 
    response.Cookies.Clear(); 
    response.ContentType = ContentType; 
    response.ContentEncoding = Encoding.Default; 
    response.AddHeader("Content-Type", ContentType); 
    context.HttpContext.Response.AddHeader("Content-Disposition", 
          String.Format("attachment; filename={0}", 
          this.DownloadName)); 
    int ind = 0; 
    using (ZipOutputStream zipOStream = 
       new ZipOutputStream(context.HttpContext.Response.OutputStream)) 
    { 
     foreach (var file in FilesToZip) 
     { 
      ZipEntry entry = new ZipEntry(FilesToZipNames[ind++]); 
      zipOStream.PutNextEntry(entry); 
      Thread.Sleep(1000); 
      zipOStream.Write(file, 0, file.Length); 
      zipOStream.Flush(); 
     } 
     zipOStream.Finish(); 
    }  
    response.OutputStream.Flush(); 
} 

Parece que el zip no comenzará a transmitir hasta que todos los archivos estén comprimidos. ¿Hay alguna manera de transmitir continuamente? Tal vez con una biblioteca diferente?

Respuesta

9

Suponiendo que el formato zip es parcial a la transmisión, su problema es que su respuesta está siendo almacenada de manera predeterminada. Si configura HttpResponseBase.BufferOutput como falso, debería comenzar a transmitir de inmediato.

+0

Gracias, eso fue todo. – maxfridbe

0

Creo que es posible que necesite enjuagar el outputtream en lugar del zipostream para ver cualquier salida a http. Entonces, response.OutputStream.Flush() aparecería en su ciclo en ese caso. Sin embargo, no estoy seguro de si realmente resolverá su problema.

Cuestiones relacionadas