2012-01-10 42 views
6

Cuando se utiliza un estándar <input type="file" /> en un sitio MVC3, puede recibir el archivo en su método de acción mediante la creación de un parámetro de entrada de tipo HttpPostedFile y establecer la forma de enctype="multipart/form-data"archivos avanzado Asp.Net subir

Uno de los problemas de este enfoque es que la solicitud no se completa y no se transfiere a su método de acción hasta que se haya cargado todo el contenido del archivo.

me gustaría hacer algunas cosas para ese archivo a medida que se carga en el servidor. Básicamente, quiero recibir de manera asíncrona los datos a medida que entran y, luego, manejar los bytes de datos por byte mediante programación.

Para lograr lo anterior me imagino que tendrá que manejar esta parte de la solicitud en un HttpModule o costumbre HttpHandler tal vez. Estoy familiarizado con cómo funcionan esas cosas, pero no estoy familiarizado con el método de recibir los datos de carga de archivos de manera asincrónica.

Sé que esto es posible porque he trabajado con componentes de terceros en el pasado que hacer esto (normalmente para que puedan informar el progreso de carga, o almacenar en caché los datos en el disco para evitar las limitaciones de memoria de iis/asp.net). Desafortunadamente, todos los componentes que he usado son de código cerrado, así que no puedo mirar dentro y ver qué están haciendo.

No estoy buscando para el código, pero puedo conseguir alguien me señaló en la dirección correcta aquí?

+0

¿Ha mirado pasar la solicitud fuera a un servicio WCF? – Lloyd

+0

un vistazo a [el post de Jon Galloway] (http://weblogs.asp.net/jgalloway/archive/2008/01/08/large-file-uploads-in-asp-net.aspx), se puede señalar que en la dirección correcta (específicamente su mención de [NeatUpload] (http://neatupload.codeplex.com/) parece prometedora). – staterium

Respuesta

1

uso de un servicio WCF puede enviar flujos de archivos desde y hacia su servicio.

Aquí es el lado del servicio reciben código que utilizo:

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(); 
} 

Si que se parece a lo que quieres, echa un vistazo a la CodeProject File Transfer Progress. Se entra en muchos detalles en los que mi código se basa libremente.

+0

¿Se puede utilizar esto para cargar un formulario multiparte desde un navegador web? – StriplingWarrior

+0

Si bien esto es interesante y aprecio el tiempo que se tarda en publicar esto, no parece funcionar con datos de archivos enviados utilizando multipart/form-data (por ejemplo, desde un formulario html típico). – Erick

+0

Ok, lo siento, lo uso en mi código de carga/descarga para cargar varios archivos y usar una barra de progreso (para un programa de cliente, no para otra página web). –

Cuestiones relacionadas