2015-09-02 8 views
14

voglio fare qualcosa dopo utente termina il downloadCompletato evento per FilePathResult

public class TestController : Controller 
{ 
    public FilePathResult Index() 
    { 
     return File("path/to/file", "mime"); 
    } 
} 

Quello che ho cercato è quello di aggiungere i seguenti eventi per testare controllo ma tutti gli incendi prima di finitura utente scaricano (tranne distruttore che non viene mai chiamato

risposta

2

È possibile provare a utilizzare FileStreamResult personalizzato come descritto qui - http://odetocode.com/blogs/scott/archive/2010/06/23/checking-client-download-success-with-asp-net-mvc.aspx.

public class CheckedFileStreamResult : FileStreamResult 
{ 
    public CheckedFileStreamResult(FileStream stream, string contentType) 
     :base(stream, contentType) 
    { 
     DownloadCompleted = false; 
    } 

    public bool DownloadCompleted { get; set; } 

    protected override void WriteFile(HttpResponseBase response) 
    { 
     var outputStream = response.OutputStream; 
     using (FileStream) 
     { 
      var buffer = new byte[_bufferSize]; 
      var count = FileStream.Read(buffer, 0, _bufferSize); 
      while(count != 0 && response.IsClientConnected) 
      {     
       outputStream.Write(buffer, 0, count); 
       count = FileStream.Read(buffer, 0, _bufferSize); 
      } 
      DownloadCompleted = response.IsClientConnected; 
     } 
    } 

    private const int _bufferSize = 0x1000; 
} 

Come si vede, il metodo WriteFile è sovrascritto e logica personalizzata viene implementata per servire Response.OutputStream al cliente per la lettura di pezzi da FileStream e scrivendo a OutputStream. Alla fine di questo processo puoi considerare il file scaricato. Quindi puoi controllare DownloadCompletato nel gestore OnResultExecuted del controller. In alternativa, è possibile provare a trasferire il delegato Azione personalizzato al costruttore CheckedFileStreamResult e richiamarlo al termine del download (anziché utilizzare il flag DownloadCompleted).

0

Il client (un browser) esegue il download, il server non viene informato quando viene eseguito. Con HTTP non puoi dire al cliente di fare qualcos'altro dopo il download.

+0

Non voglio dirgli di fare qualcos'altro. Il server che invia lo stream quindi dovrebbe sapere quando è finito. – Almis

3

C'è soluzione pronta per jQuery, check this out http://johnculviner.com/jquery-file-download-plugin-for-ajax-like-feature-rich-file-downloads/
L'idea è piuttosto semplice: sul lato server si crea attributo che definisce cookie personalizzato dopo l'azione eseguita, sul lato client si utilizza setTimeout a controlla questo cookie e fai qualcosa quando arriverà.

+1

Non consiglierei di usare più i cookie per nulla. (a meno che non sia immerso nella tua bevanda preferita). – ericosg

+0

Sono molto grato per il commento argomentativo. Naturalmente, è possibile utilizzare diversi modi per controllare alcune informazioni dal server, ma questo è il più veloce/semplice in questo caso – HollyDolly

0

Se si desidera eseguire un'operazione sul server, è possibile utilizzare PushStreamContent. Here è la risposta StackOverflow e uno blog entry.

+0

PushStreamContent è basato su SignalR? Puoi fornirmi qualche fonte da leggere? Suppongo che si basi su Headers.TransferEncodingChunked = true .. – user2527768

+0

Hai ragione. Ho sbagliato, non dipende da signalR. Ho cancellato il mio commento. – qub1n

+0

Grazie. Ma come hai cancellato il tuo commento, il mio sembra orfano. – user2527768

0

In genere sono necessari due thread, uno per il download e uno per la notifica. Sul lato server questi thread condividono le informazioni su quanti byte sono stati inviati dalla lunghezza del file. Il thread di download viene eseguito tramite IHttpHandler, dove si analizza la query http e si scrivono i byte sul buffer di risposta HTTP per buffer e si aggiornano le informazioni condivise con il thread di notifica. Il thread di notifica è una query ajax ripetuta dalla pagina in cui hai iniziato a scaricare. Puoi anche eseguire il rendering della barra di avanzamento del download con jquery.

Problemi correlati