2010-01-15 10 views
12

Imgur es una página web de subir una imagen que ofrece una API to uploadCarga en imgur.com

Mi código es exactamente igual que el código PHP que proporcionan como un ejemplo. sin embargo, en su código php son http_build_query($pvars);

Parece que están URLEncoding su consulta antes de publicarla. editar: Tenga en cuenta que he cambiado a .NET 3.5 completo en lugar del perfil del cliente. Esto me dio acceso a system.web, así que usé httputliity.urlencode(). Esto hizo que la API devolviera un "error" con una "no se envió ninguna imagen". Si no codifico, la API devuelve un "OK" con un enlace a la imagen, sin embargo, no se carga ninguna imagen (como un archivo en blanco).

¿Cómo puedo corregir mi código para que funcione correctamente en su API?

Image image = Image.FromFile("C:\\Users\\Affan\\Pictures\\1509310.jpg"); 
     MemoryStream ms = new MemoryStream(); 
     // Convert Image to byte[] 
     image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     byte[] imageBytes = ms.ToArray(); 

     WebRequest wb = WebRequest.Create(new Uri("http://imgur.com/api/upload.xml")); 
     wb.ContentType = "application/x-www-form-urlencoded";    
     wb.Method = "POST"; 
     wb.Timeout = 10000; 
     Console.WriteLine(imageBytes.Length); 
     string parameters = "key=433a1bf4743dd8d7845629b95b5ca1b4&image=" + Convert.ToBase64String(imageBytes); 


     Console.WriteLine("parameters: " + parameters.Length); 
     System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
     byte[] bytes = encoding.GetBytes(parameters); 
     // byte[] bytes = Convert.FromBase64String(parameters); 

     System.IO.Stream os = null; 
     try { // send the Post 
      wb.ContentLength = bytes.Length; //Count bytes to send 
      os = wb.GetRequestStream();    
      os.Write(bytes, 0, bytes.Length);   //Send it 
     } catch (WebException ex) { 
      MessageBox.Show(ex.Message, "HttpPost: Request error"); 
      Console.WriteLine(ex.Message); 
     } finally { 
      if (os != null) { 
       // os.Close(); 
      } 
     } 

     try { // get the response 
      WebResponse webResponse = wb.GetResponse(); 

      StreamReader sr = new StreamReader(webResponse.GetResponseStream()); 
      //MessageBox.Show(sr.ReadToEnd().Trim()); 
      Console.WriteLine(sr.ReadToEnd().Trim()); 
     } catch (WebException ex) { 
      MessageBox.Show(ex.Message, "HttpPost: Response error"); 
     }  
+0

https://www.youtube.com/watch?v=XZxzJGgox_E -> Por favor no ponga de su aplicación clave y la identificación con su código. – xoxel

Respuesta

10

que he acabo de subir esta imagen

Hello World

utilizando este código:

using (var w = new WebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "key", "433a1bf4743dd8d7845629b95b5ca1b4" }, 
     { "image", Convert.ToBase64String(File.ReadAllBytes(@"hello.png")) } 
    }; 

    byte[] response = w.UploadValues("http://imgur.com/api/upload.xml", values); 

    Console.WriteLine(XDocument.Load(new MemoryStream(response))); 
} 

Es posible que desee cambiar su clave de API ahora :-)

La salida fue:

<rsp stat="ok"> 
    <image_hash>IWg2O</image_hash> 
    <delete_hash>fQAXiR2Fdq</delete_hash> 
    <original_image>http://i.imgur.com/IWg2O.png</original_image> 
    <large_thumbnail>http://i.imgur.com/IWg2Ol.jpg</large_thumbnail> 
    <small_thumbnail>http://i.imgur.com/IWg2Os.jpg</small_thumbnail> 
    <imgur_page>http://imgur.com/IWg2O</imgur_page> 
    <delete_page>http://imgur.com/delete/fQAXiR2Fdq</delete_page> 
</rsp> 
+0

WOW, pasé casi 5 horas en eso .. gracias por eso. ¿Puedes entender por qué mi camino no estaba funcionando? – masfenix

+0

¡Buena respuesta! Siempre me gusta una solución 'menos es más'. De acuerdo, fuiste por los huesos sin ningún tipo de comprobación de errores, pero incluso agregar eso en ... Sí, bueno. – JMD

+0

Tenga en cuenta que * imgur * cambió a una nueva versión de su API. El URI para la [API anónima de la versión 2] (http://api.imgur.com/resources_anon) es 'http: // api.imgur.com/2/upload'. El XML de respuesta ha cambiado, pero el código de C# para hacer la solicitud es diferente del URI. – dtb

8

Aquí es una versión actualizada de la respuesta de DTB para la versión 3 del API utilizando la carga anónima (es necesario registrar su aplicación en http://api.imgur.com/ para obtener su ID de cliente):

using (var w = new WebClient()) 
{ 
    string clientID = "<<INSERT YOUR ID HERE>>"; 
    w.Headers.Add("Authorization", "Client-ID " + clientID); 
    var values = new NameValueCollection 
    { 
     { "image", Convert.ToBase64String(File.ReadAllBytes(@"hello.png")) } 
    }; 

    byte[] response = w.UploadValues("https://api.imgur.com/3/upload.xml", values); 

    Console.WriteLine(XDocument.Load(new MemoryStream(response))); 
} 

Y la respuesta es ahora como esto (ver http://api.imgur.com/models/image):

<data success="1" status="200"> 
    <id>SbBGk</id> 
    <title/> 
    <description/> 
    <datetime>1341533193</datetime> 
    <type>image/jpeg</type> 
    <animated>false</animated> 
    <width>2559</width> 
    <height>1439</height> 
    <size>521916</size> 
    <views>1</views> 
    <bandwidth>521916</bandwidth> 
    <deletehash>eYZd3NNJHsbreD1</deletehash> 
    <section/> 
    <link>http://i.imgur.com/SbBGk.jpg</link> 
</data> 
0

I Guess que la solución está en desuso dtb

using (var w = new WebClient()) 
    { 
     var values = new NameValueCollection 
    { 
     {"image", Convert.ToBase64String(imageData)}, 
     {"type", "base64"} 
    }; 

     w.Headers.Add("Authorization", "Client-ID xxxxxxxxx"); 
     var response = w.UploadValues("https://api.imgur.com/3/image", values); 
    } 

otra manera de hacerlo:

 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.imgur.com/3/image"); 
     request.Headers.Add("Authorization", "Client-ID xxxxxxx"); 
     request.Method = "POST"; 

     ASCIIEncoding enc = new ASCIIEncoding(); 
     string postData = Convert.ToBase64String(imageData); 
     byte[] bytes = enc.GetBytes(postData); 

     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = bytes.Length; 

     Stream writer = request.GetRequestStream(); 
     writer.Write(bytes, 0, bytes.Length); 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse();