Retrieving form data from an HttpListenerRequest

I have an HttpListenerRequest that was initiated from the html <form> that was published. I need to know how to get published form values ​​+ uploaded files. Does anyone know an example to save me when I do this for myself? I had google, but I did not find anything useful.

+6
c # forms
source share
2 answers

I found some examples of web servers for MonoTouch, but none of them analyzed the data sent in the POST request. I looked through the network and could not find examples of how to achieve this. So, now that I wrote this myself, I decided to share my own implementation. This includes not only code for processing form data, but also for registering request handlers, etc.

Here is an example of how you will use the web server

  public BookUploadViewController() : base("BookUploadViewController", null) { RequestHandler = new DefaultRequestHandler(); var defaultActionHandlerFactory = new DefaultActionHandlerFactory(); RegisterActionHandlers(defaultActionHandlerFactory); RequestHandler.AddActionHandlerFactory(defaultActionHandlerFactory); WebServer = new EmbeddedWebServer(RequestHandler); } void RegisterActionHandlers(DefaultActionHandlerFactory factory) { factory.RegisterHandler( request => request.RawUrl == "/", request => new IndexActionHandler(request) ); factory.RegisterHandler( request => string.Compare(request.RawUrl, "/Upload", true) == 0 && string.Compare(request.HttpMethod, "POST", true) == 0, request => new UploadActionHandler(request) ); } public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); StatusLabel.Text = string.Format("Server listening on\r\nhttp://{0}:8080", GetIPAddress ()); WebServer.Start(8080); } public override void ViewDidDisappear (bool animated) { base.ViewDidDisappear(animated); WebServer.Stop(); } 

And here are two examples of specific request handlers

  class IndexActionHandler : DefaultActionHandler { public IndexActionHandler(HttpListenerRequest request) : base(request) { } public override ActionResult Execute() { var result = new HtmlResult(); result.AppendLine("<html>"); result.AppendLine("<body>"); result.AppendLine("<h1>Upload an image</h1>"); result.AppendLine("<form action='/Upload' enctype='multipart/form-data' method='post'>"); result.AppendLine ("<input name='Image' type='file'/><br/>"); result.AppendLine("<input name='Upload' type='submit' text='Upload'/>"); result.AppendLine("</form>"); result.AppendLine("</body>"); result.AppendLine("</html>"); return result; } } class UploadActionHandler : DefaultActionHandler { public UploadActionHandler(HttpListenerRequest request) : base(request) { } public override ActionResult Execute() { string errorMessage = null; var file = FormData.GetFile("Image"); if (file == null || file.FileData == null || file.FileData.Length == 0 || string.IsNullOrEmpty(file.FileName)) errorMessage = "No image uploaded"; if (errorMessage == null) ProcessFile(file); var result = new HtmlResult(); result.AppendLine("<html>"); result.AppendLine("<body>"); if (errorMessage == null) result.AppendLine("<h1>File uploaded successfully</h1>"); else { result.AppendLine("<h1>Error</h1>"); result.AppendLine("<h2>" + errorMessage + "</h2>"); } result.AppendLine("</body>"); result.AppendLine("</html>"); return result; } void ProcessFile(MultiPartStreamFileValue postedFile) { string fileName = "Where to save the file"; using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) { fileStream.Write(postedFile.FileData, 0, postedFile.FileData.Length); } } } 

You can download the source code here https://sites.google.com/site/mrpmorris/EmbeddedWebServerMT.zip

-2
source

The main thing to understand is that the HttpListener is a low-level tool for working with http requests. All post data is in the HttpListenerRequest.InputStream stream. Suppose we have a form like this:

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

Now we want to see the message data. Let's implement a method for this:

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

Download the file and see the result:

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

Next, suppose we have a simple form without uploading files:

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

Look at the exit:

 firstname=MyName&lastname=MyLastName 

The result of the combined form:

 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... 

As you can see with a simple form, you can just read the InputStream for the string and parse the post values. If there is a more complex form, you need to do more complex parsing, but this can still be done. Hope these examples save your time. Please note: this is not always the case to read the entire stream as a string.

+11
source

All Articles