2011-03-04 12 views
8

Tengo un HttpListenerRequest que se inició desde un html <form> que se publicó. Necesito saber cómo obtener los valores del formulario publicados + los archivos cargados. ¿Alguien sabe de un ejemplo para ahorrarme tiempo haciéndolo por mí mismo? He tenido un google alrededor pero no encontré nada de uso.Obteniendo datos de formulario de HttpListenerRequest

Respuesta

10

Lo más importante de entender es que HttpListener es una herramienta de bajo nivel para trabajar con solicitudes http. Todos los datos de la publicación están en la secuencia HttpListenerRequest.InputStream. Supongamos que tenemos un formulario como ese:

<form method=\"post\" enctype=\"multipart/form-data\"><input id=\"fileUp\" name=\"fileUpload\" type=\"file\" /><input type=\"submit\" /></form> 

Ahora queremos ver los datos de la publicación. Vamos a implementar un método para hacer esto:

public static string GetRequestPostData(HttpListenerRequest request) 
{ 
    if (!request.HasEntityBody) 
    { 
    return null; 
    } 
    using (System.IO.Stream body = request.InputStream) // here we have data 
    { 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(body, request.ContentEncoding)) 
    { 
     return reader.ReadToEnd(); 
    } 
    } 
} 

subir algunos archivos y ver resultado:

Content-Disposition: form-data; name="somename"; filename="D:\Test.bmp" 
Content-Type: image/bmp 
...here is the raw file data... 

Siguiente supongamos que tenemos forma sencilla y sin la carga de archivos:

<form method=\"post\">First name: <input type=\"text\" name=\"firstname\" /><br />Last name: <input type=\"text\" name=\"lastname\" /><input type=\"submit\" value=\"Submit\" /></form> 

Veamos la salida :

firstname=MyName&lastname=MyLastName 

Combinado resultado formulario:

Content-Disposition: form-data; name="firstname" 
My Name 
Content-Disposition: form-data; name="somename"; filename="D:\test.xls" 
Content-Type: application/octet-stream 
...raw file data... 

Como se puede ver en el caso de forma sencilla se puede simplemente leer InputStream a cuerda y analizar los valores de correos. Si hay una forma más compleja, necesita realizar un análisis más complejo, pero aún se puede hacer. Espero que estos ejemplos le ahorren tiempo. Tenga en cuenta que ese no es siempre el caso de leer todo el flujo como una cadena.

+5

Gracias. Ya sabía eso, solo esperaba que alguien supiera de un ejemplo para ahorrarme tiempo de escribir uno. ¡Alguien debe haber hecho esto antes! –

+0

Esto es ciertamente una respuesta útil, pero estoy descubriendo que con grandes transferencias de archivos obtengo una OutOfMemoryException con mi llamada a reader.ReadToEnd(). ¿Hay una manera simple de transmitir el archivo en incrementos o resolver este problema? – vargonian

+0

[Ejemplo de código de análisis de formulario] (http://blog.mikehacker.net/2006/11/13/httplistener-and-forms/). En respuesta a la 'OutOfMemoryException', los datos de su Formulario no deberían ser tan grandes que exploten la memoria. Debe verificar el tipo de contenido antes de intentar analizar los datos de la secuencia en un formulario. –

Cuestiones relacionadas