Uploading an image using C# and WebRequest?

c#, httpwebrequest, post, webrequest

Solution

Try this:

string file = @"C:\Users\Sergio\documents\visual studio 2010\Projects\WpfApplication1\WpfApplication1\Test\Avatar.png";
string parameters = @"key=1df918979bf3f8dff2125c22834210903&image=" +
    Convert.ToBase64String(File.ReadAllBytes(file));

Problem

Here is the working code in Python (using cURL): ``` #!/usr/bin/python import pycurl c = pycurl.Curl() values = [ ("key", "YOUR_API_KEY"), ("image", (c.FORM_FILE, "file.png"))] # OR: ("image", "http://example.com/example.jpg"))] # OR: ("image", "BASE64_ENCODED_STRING"))] c.setopt(c.URL, "http://imgur.com/api/upload.xml") c.setopt(c.HTTPPOST, values) c.perform() c.close() ``` Here's what I have in C#: ``` public void UploadImage() { //I think this line is doing something wrong. //byte[] x = File.ReadAllBytes(@"C:\Users\Sergio\documents\visual studio 2010\Projects\WpfApplication1\WpfApplication1\Test\hotness2.jpg"); //If I do it like this, using a direct URL everything works fine. string parameters = @"key=1b9189df79bf3f8dff2125c22834210903&image=http://static.reddit.com/reddit.com.header.png"; //Convert.ToBase64String(x); WebRequest webRequest = WebRequest.Create(new Uri("http://imgur.com/api/upload")); webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes(parameters); Stream os = null; try { // send the Post webRequest.ContentLength = bytes.Length; //Count bytes to send os = webRequest.GetRequestStream(); os.Write(bytes, 0, bytes.Length); //Send it } catch (WebException ex) { MessageBox.Show(ex.Message, "HttpPost: Request error"); } finally { if (os != null) { os.Close(); } } try { // get the response WebResponse webResponse = webRequest.GetResponse(); StreamReader sr = new StreamReader(webResponse.GetResponseStream()); MessageBox.Show(sr.ReadToEnd().Trim()); } catch (WebException ex) { MessageBox.Show(ex.Message, "HttpPost: Response error"); } } ``` Now, the things I noticed is that when I changed my API key in the parameters string to "239231" or whatever number, the response I got was: "Invalid API key." So I think something must be working right. I placed my correct API key and now I get a different response: "Invalid image format. Try uploading a JPEG image." The service I'm using accepts almost every image format, so I am 100% certain the error is in the way I'm sending the file. Can anyone shed some light? EDIT!!! It turns out when I upload a JPG image I get that gray box thing. If I upload a big jpg image I don't get anything. For example: https://i.stack.imgur.com/8Y4uB.jpg When I upload PNG's, the image uploaded doesn't even show. I'm certain the issue is the encoding. What can I do? EDIT 2!!! Now I'm 100% certain that the problem lies in the first line of the method. The File.ReadAllBytes() must be doing something wrong. If I upload a URL file, every works peachy: https://i.stack.imgur.com/clcmZ.png I wonder what encoding I should use. :S

Original source

Related problems