2010-02-02 11 views
5

Devo attivare download utente di file di grandi dimensioni in un browser Web, in cui creo il file da trasferire sul server, quindi lo elimina subito dopo. Ho trovato abbastanza esempi per vedere che probabilmente dovrei usare Response.TransmitFile o Response.WriteFile ... ma ho sentito che ci sono problemi con entrambi:WriteFile vs TransmitFile per file di grandi dimensioni che devono essere eliminati dal server dopo il trasferimento

WriteFile è sincrono, ma memorizza il file in memoria prima di inviarlo per l'utente. Dato che ho a che fare con file molto grandi, questo potrebbe causare problemi.

TransmitFile non esegue il buffer locale, quindi funziona per file di grandi dimensioni, ma è asincrono, quindi non è possibile eliminare il file dopo aver chiamato TransmitFile. A quanto pare il flush del file non garantisce che posso eliminarlo?

Qual è il modo migliore per gestire questo?

C'è anche il BinaryWrite ... posso eseguire il looping di un flusso di file, copiandolo in segmenti?

risposta

0

È possibile memorizzare il file su disco (nome casuale ecc.) E avviare l'invio, ma aggiungere una voce a una tabella DB con il nome file temporaneo, dopo un periodo di tempo definito, fare passare un lavoro di pulizia in quei DB voci e cancella il file dal disco se è invecchiato.

2

WriteFile è sincrono, ma tampona il file in memoria prima inviarlo all'utente. Dato che sono che si occupa di file molto grandi, questo potrebbe causare problemi.

Credo che si possa disabilitare il buffering su WriteFile impostando Response.BufferOutput = false;

Una volta che questo è stato impostato su false si dovrebbe essere in grado di chiamare WriteFile senza buffering ...

0

WriteFile metodo viene utilizzato per scaricare il piccolo file dal server, il parametro di dimensione deve essere compreso tra zero e il valore Int32 massimo, prima di trasferire il file memorizza il file in memoria. TransmitFile Il metodo viene utilizzato per scaricare il file di grandi dimensioni dal server e non memorizza il file in memoria. Tuttavia, quando tenta di eliminare il file durante il download, genera un'eccezione. Di seguito è riportato il codice che eliminerebbe il file dopo averlo scaricato.

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");