Click here to Skip to main content
15,919,245 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I want to post my image to my web server using HTTP POST. And i am using the following method, got it from "stackoverflow" platform, but the following code initially giving me the error of "(405) Method not allowed" but today it is giving me an error "The remote Server returned an error (500) Internal Server Error" I am sure i am doing something wrong.. Just needs your expert advise..

C#
public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc)
    {
        //log.Debug(string.Format("Uploading {0} to {1}", file, url));
      //  MessageBox.Show(string.Format("Uploading {0} to {1}", file, url));
        string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

        HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
        wr.ContentType = "multipart/form-data; boundary=" + boundary;
        wr.Method = "POST";
        wr.KeepAlive = true;
        wr.Credentials = System.Net.CredentialCache.DefaultCredentials;

        Stream rs = wr.GetRequestStream();

        string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
        foreach (string key in nvc.Keys)
        {
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            string formitem = string.Format(formdataTemplate, key, nvc[key]);
            byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
            rs.Write(formitembytes, 0, formitembytes.Length);
        }
        rs.Write(boundarybytes, 0, boundarybytes.Length);

        string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
        string header = string.Format(headerTemplate, paramName, file, contentType);
        byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
        rs.Write(headerbytes, 0, headerbytes.Length);

        FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
        byte[] buffer = new byte[4096];
        int bytesRead = 0;
        while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            rs.Write(buffer, 0, bytesRead);

        }
        fileStream.Close();

        byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
        rs.Write(trailer, 0, trailer.Length);
        rs.Close();

        WebResponse wresp = null;
        try
        {
            wresp = wr.GetResponse();  //Catching Exception in this line 
            Stream stream2 = wresp.GetResponseStream();
            StreamReader reader2 = new StreamReader(stream2);
            MessageBox.Show(reader2.ReadToEnd(), "File uploaded, server response is: ");
           // log.Debug(string.Format("File uploaded, server response is: {0}", reader2.ReadToEnd()));
        }
        catch (Exception ex)
        {
            //log.Error("Error uploading file", ex);
            MessageBox.Show(ex.Message, "Error uploading file");
            if (wresp != null)
            {
                wresp.Close();
                wresp = null;
            }
        }
        finally
        {
            wr = null;
        }
    }


and calling the above method in the following way under button Click event...

C#
private void btn_Click(object sender, EventArgs e)
    {
        NameValueCollection nvc = new NameValueCollection();
        nvc.Add("username", "Haris");
        nvc.Add("password", "pass");
        nvc.Add("Title", "Test Image");
        nvc.Add("Comments", "Test Image");
        //nvc.Add("fileUpload1", "a.jpg");
        HttpUploadFile("http://blog.test.co/testpost.aspx", @imgpath, "fileUpload1", "image/jpeg", nvc);

    }


I hope i have explained enough... Your advise in this matter will be much appreciated...

Thanks in advance
Posted
Updated 13-May-14 2:54am
v3

"500 Internal Server Error" just means that your code crashed, but since there is no exception message or anything useful in the error that you posted, it's pretty difficult to trace where the problem is. So, set a breakpoint on the first line in the method that you posted and try the operation again. You can then step through the code, line by line, and see what's going on in the debugger, checking the contents of variables and whatnot, until you get to the point where it throws an exception.
 
Share this answer
 
Comments
Arslan Elahi 13-May-14 8:42am    
Thank you very much for your response Dave... it is throwing the error on the following line that is placed inside the last try block of the above code
wresp = wr.GetResponse();
Dave Kreskowiak 13-May-14 8:57am    
Sigh...and the exception message?? Or do you want everyone to guess?
Arslan Elahi 13-May-14 10:41am    
brother i have already mentioned the error in the question and that is (The Remote Server returned an error (500) Internal Server Error)
Dave Kreskowiak 13-May-14 11:04am    
No, that's the error the browser shows you. The error you see in the debugger (caught by your Try/Catch block is another story.
Arslan Elahi 13-May-14 11:05am    
no... i am trying to post using C# windows application... it is showing me in try/Catch block
Thank you for responding to my question . i got the solution of the above problem..
The above client side code is perfect for posting image to server via HTTP but the problem was...

- I was posting the image with the image path (path of local hard drive) not the image name, that was wrong.
- But server needs a file name (image name) to save the file on the server's hard drive..

This was the main reason that's why server responding me (The remote Server returned an error (500) Internal Server Error).

Anyway server responding the above error when any type of exception comes in the server code and you haven't managed exception handling.


Hope it will help others
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900