2012-01-10 16 views
6

Quando si utilizza uno standard <input type="file" /> su un sito MVC3, è possibile ricevere il file nel metodo di azione con la creazione di un parametro di ingresso di tipo HttpPostedFile e l'impostazione del modulo per enctype="multipart/form-data"Asp.Net di file avanzato caricando

Uno dei problemi di questo approccio è che la richiesta non viene completata e non viene trasferita al tuo metodo di azione fino a quando non è stato caricato l'intero contenuto del file.

Mi piacerebbe fare alcune cose su quel file mentre viene caricato sul server. Fondamentalmente voglio ricevere i dati in modo asincrono e quindi gestisco i dati byte per byte.

Per realizzare quanto sopra, immagino che sarà necessario gestire questa parte della richiesta in un HttpModule o HttpHandler personalizzato forse. Ho familiarità con il modo in cui funzionano queste cose, ma non ho familiarità con il metodo di ricezione dei dati di caricamento dei file in modo asincrono.

So che questo è possibile perché in passato ho lavorato con componenti di terze parti fare questo (normalmente in modo da poter riportare l'avanzamento del caricamento o memorizzare i dati sul disco per evitare limitazioni di memoria iis/asp.net). Sfortunatamente tutti i componenti che ho usato sono closed source, quindi non posso sbirciare dentro e vedere cosa stanno facendo.

Non sto cercando codice, ma qualcuno può farmi puntare nella giusta direzione qui?

+0

Hai guardato passare la richiesta a un servizio WCF? – Lloyd

+0

Dai un'occhiata al [post di Jon Galloway] (http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx), potrebbe farti notare nella giusta direzione (in particolare la sua citazione di [NeatUpload] (http://neatupload.codeplex.com/) sembra promettente). – staterium

risposta

1

Utilizzando un servizio WCF è possibile inviare flussi di file al e dal servizio.

Ecco il lato servizio codice di ricezione che uso:

int chunkSize = 2048; 
byte[] buffer = new byte[chunkSize]; 

using (System.IO.FileStream writeStream = 
    new System.IO.FileStream(file.FullName, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write)) 
{ 
    do 
    { 
     // read bytes from input stream 
     int bytesRead = request.FileByteStream.Read(buffer, 0, chunkSize); 
     if (bytesRead == 0) break; 

     // write bytes to output stream 
     writeStream.Write(buffer, 0, bytesRead); 
    } while (true); 

    writeStream.Close(); 
} 

Se che assomiglia a ciò che si vuole, controllare il CodeProject File Transfer Progress. Entra in un sacco di dettagli su cui il mio codice è liberamente basato.

+0

Può essere utilizzato per caricare un modulo multipart da un browser Web? – StriplingWarrior

+0

Mentre questo è interessante e apprezzo il tempo impiegato per postare questo, non sembra funzionare con i dati dei file inviati usando multipart/form-data (es: da un tipico modulo html). – Erick

+0

Ok, scusa lo uso nel mio codice di upload/download per caricare più file e utilizzare una barra di avanzamento (per un programma client, non un'altra pagina Web). –