Upload a photo to Facebook using HttpClient

I am trying to use the following code to upload photos to Facebook using the Graph API. I keep getting a β€œbad request”, but I don’t know why. I can upload a photo using curl with the same options. I am using Java with HttpClient.

PostMethod filePost = new PostMethod('https://graph.facebook.com/me/photos'); filePost.setParameter('access_token', 'my-access-token') filePost.setParameter('message', 'test image') filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false); try { println("Uploading " + file.getName() + " to 'https://graph.facebook.com/me/photos'"); Part[] parts = [new FilePart('source', file.getName(), file)] filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); HttpClient client = new HttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); int status = client.executeMethod(filePost); if (status == HttpStatus.SC_OK) { println( "Upload complete, response=" + filePost.getResponseBodyAsString() ); } else { println( "Upload failed, response=" + HttpStatus.getStatusText(status) ); } } catch (Exception ex) { println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage()); ex.printStackTrace(); } finally { filePost.releaseConnection(); } 

UPDATE: More. I grabbed more information about this answer, and I get the following:

{"error": {"type": "OAuthException", "message": "An active access token should be used to request information about the current user." }}

But this does not seem to be correct, since I use the access token, which facebook returns to me after the authorization process.

Curl working code:

 curl -F 'access_token=my-access-token' -F ' source=@ /path/to/image.jpg' -F 'message=Some caption' https://graph.facebook.com/me/photos 
+4
source share
3 answers

I solved the problem. Instead of adding parameters to PostMethod, I needed to add access_token and a message to the Part [] array. Full code:

  PostMethod filePost = new PostMethod('https://graph.facebook.com/me/photos'); filePost.getParams().setBooleanParameter(HttpMethodParams.USE_EXPECT_CONTINUE, false); try { println("Uploading " + file.getName() + " to 'https://graph.facebook.com/me/photos'"); Part[] parts = [new FilePart('source', file.getName(), file), new StringPart('access_token', "${facebookData.access_token}"), new StringPart('message', 'some message')] filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams())); HttpClient client = new HttpClient(); client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); int status = client.executeMethod(filePost); if (status == HttpStatus.SC_OK) { println("Upload complete, response=" + filePost.getResponseBodyAsString()); } else { println("Upload failed, response=" + HttpStatus.getStatusText(status)); // Create response StringBuilder notificationsSendResponse = new StringBuilder(); byte[] byteArrayNotifications = new byte[4096]; for (int n; (n = filePost.getResponseBodyAsStream().read(byteArrayNotifications)) != -1;) { notificationsSendResponse.append(new String(byteArrayNotifications, 0, n)); } String notificationInfo = notificationsSendResponse.toString(); } } catch (Exception ex) { println("ERROR: " + ex.getClass().getName() + " " + ex.getMessage()); ex.printStackTrace(); } finally { filePost.releaseConnection(); } 
+4
source

You can use socialauth java api to upload image via web application.

http://code.google.com/p/socialauth/

+3
source

this is the version for android version

  private void postOnFacebook() { try { HttpPost httpPost = new HttpPost("https://graph.facebook.com/me/photos"); MultipartEntity entity = new MultipartEntity(); String base64Image = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3gro4KMKOPLqAAAq/UdZuRmLacAAAAASUVORK5CYII="; byte[] imageData = Base64.decode(base64Image, 0); entity.addPart("access_token", new StringBody("your access token")); entity.addPart("message", new StringBody("test msg")); entity.addPart("source", new ByteArrayBody(imageData, "test")); CloseableHttpClient httpclient = HttpClientBuilder.create().build(); httpPost.getParams().setBooleanParameter(USE_EXPECT_CONTINUE, false); httpPost.setEntity(entity); HttpResponse resp = httpclient.execute(httpPost); HttpEntity entity2 = resp.getEntity(); if (entity != null) { String responseBody = EntityUtils.toString(entity2); responseBody.toString(); } } catch (Exception ex) { ex.printStackTrace(); } } ";  private void postOnFacebook() { try { HttpPost httpPost = new HttpPost("https://graph.facebook.com/me/photos"); MultipartEntity entity = new MultipartEntity(); String base64Image = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAASSURBVBhXY3gro4KMKOPLqAAAq/UdZuRmLacAAAAASUVORK5CYII="; byte[] imageData = Base64.decode(base64Image, 0); entity.addPart("access_token", new StringBody("your access token")); entity.addPart("message", new StringBody("test msg")); entity.addPart("source", new ByteArrayBody(imageData, "test")); CloseableHttpClient httpclient = HttpClientBuilder.create().build(); httpPost.getParams().setBooleanParameter(USE_EXPECT_CONTINUE, false); httpPost.setEntity(entity); HttpResponse resp = httpclient.execute(httpPost); HttpEntity entity2 = resp.getEntity(); if (entity != null) { String responseBody = EntityUtils.toString(entity2); responseBody.toString(); } } catch (Exception ex) { ex.printStackTrace(); } } 
+1
source

Source: https://habr.com/ru/post/1332544/


All Articles