2010-12-17 92 views
4

我正嘗試使用以下代碼將圖片上傳到Facebook使用Graph API。我不斷收到「不良要求」,但不知道爲什麼。我可以用相同的參數使用curl來上傳照片。我用HttpClient使用Java。使用HttpClient將照片上傳至Facebook

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 to this。我抓住了一些更多的信息,我得到了這個:

{「error」:{「type」:「OAuthException」,「message」:「一個活躍的訪問令牌必須用來查詢有關當前的信息用戶。「}}

但這看起來不正確,因爲我使用Facebook在授權過程後給予我的訪問令牌。

工作捲曲代碼:

curl -F 'access_token=my-access-token' -F '[email protected]/path/to/image.jpg' -F 'message=Some caption' https://graph.facebook.com/me/photos 
+0

您可以將您的工作捲曲代碼太Android版本? – 2010-12-17 22:37:20

+0

添加到帖子底部 – Gregg 2010-12-17 22:42:15

回答

4

我解決了這個問題。我不需要將參數添加到PostMethod,而是需要將access_token和消息添加到Part []數組中。完整代碼:

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(); 
    } 
+0

我需要一些幫助..你在哪裏聲明「文件」參數? – chopss 2015-04-29 06:52:12

+0

我聲明瞭文件,但它顯示不好的請求作爲迴應............................上傳bird.jpg到'https://圖.facebook.com/me/photos' 上傳失敗,回覆=錯誤請求 – chopss 2015-04-29 09:27:12

+0

此主題已有4.5年曆史。他們的API很可能已經改變,並且這已經不再相關。 – Gregg 2015-04-29 19:27:49

1

這是方法

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(); 
     } 
    }