locked
Asynchronous HttpWebRequest RRS feed

  • Question

  • Hello, I have the following code to upload an image to a site, the php page it's posted to handles the rest which is why there is a Username and Password. This code works well and does what I need, however I would like to be able to have it report the progress its done on a progressbar on my form. Iv had a google and can't seem to find much on HttpWebRequest "POST" asyncronously. Any help is appreciated, thanks!!

    public static string UploadFile(string iPath, string User, string Password)
            {
                try
                {
                    // Creates the boundary variables.
                    string bndy = "--0xKhTmLbOuNdArY";
    
                    // Creates the request for tinygrab.
                    HttpWebRequest wr = (HttpWebRequest)WebRequest.Create("http://site.com/upload.php");
    
                    // Sets the method of the request as POST
                    wr.Method = "POST";
    
                    // Sets the timeout
                    wr.Timeout = 180000;
    
                    // Sets the content type for post, in this case multipart/form-data as we are posting multiple values.
                    wr.ContentType = "multipart/form-data; boundary=" + bndy.Substring(2);
    
                    // Starts writing the data to the server (All below).
                    using (Stream strm = wr.GetRequestStream())
                    {
                        using (StreamWriter sr = new StreamWriter(strm, new System.Text.UTF8Encoding(false)))
                        {
                            //Write "user".
                            sr.WriteLine(bndy);
                            sr.WriteLine("Content-Disposition: form-data; name=\"user\"");
                            sr.WriteLine();
                            sr.WriteLine(User);
                            //Write "Password".
                            sr.WriteLine(bndy);
                            sr.WriteLine("Content-Disposition: form-data; name=\"pass\"");
                            sr.WriteLine();
                            sr.WriteLine(Password);
                            //Write "img" (file).
                            sr.WriteLine(bndy);
                            sr.WriteLine("Content-Disposition: form-data; name=\"img\"; filename=\"" + "picture" + Path.GetExtension(iPath) + "\"");
                            sr.WriteLine("Content-Type: " + MimeType(iPath));
                            sr.WriteLine();
                            sr.Flush();
                            CopyFileToStream(iPath, strm);
                            strm.Flush();
                            sr.WriteLine();
                            //Write last boundary.
                            sr.Write(bndy);
                            sr.WriteLine("--");
                        }
                    }
    
                    // The data has been passed to the web page, now we need to see what response we get.
                    using (HttpWebResponse resp = (HttpWebResponse)wr.GetResponse())
                    {
    
                        // Gets the response from the server in a stream.
                        using (StreamReader objResult = new StreamReader(resp.GetResponseStream()))
                        {
                            // Returns the value that was recieved.
                            return objResult.ReadToEnd();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Functions.LogError(ex, true);
                    return "Upload Failed";
                }
            }
    
            public static void CopyFileToStream(string iName, Stream strm)
            {
                try
                {
                    // Creates a new file stream and opens the file for reading.
                    using (FileStream fs = new FileStream(iName, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        byte[] buf = new byte[8192];
                        do
                        {
                            // Creates a integer variable of the length of the bytes content to write.
                            int bytesRead = fs.Read(buf, 0, buf.Length);
                            if (bytesRead == 0)
                            {
                                //EOF > Empty file so exit the subroutine.
                                break;
                            }
                            else
                            {
                                // Writes to the stream.
                                strm.Write(buf, 0, bytesRead);
                            }
                        }
                        while (true);
                    }
                }
                catch (Exception ex)
                {
                    Functions.LogError(ex, true);
                }
            }



    Monday, October 19, 2009 8:53 AM

All replies