2010-07-09 38 views
5

Tôi muốn tải ảnh lên facebook cho người dùng trong album mặc định cho một ứng dụng. Điều này được mô tả trong xuất bản tại đây: http://developers.facebook.com/docs/reference/api/photoNgoại lệ khi tải ảnh lên Facebook Graph API

Phương pháp đã được trả lời tại đây: How can I upload photos to album using Facebook Graph API. Tôi đang sử dụng các thông tin sau:

$args = array(
    'message' => 'Photo Caption', 
    'image' => '@'.realpath("image.png") 
); 
$data = $facebook->api('/me/photos', 'post', $args); 

Tuy nhiên tôi có ngoại lệ "(# 324) Yêu cầu tệp tải lên" khi tôi cố gắng. Tôi có phiên hợp lệ và tôi có quyền publish_stream và user_photos. Tôi có thể lấy dữ liệu bằng cách sử dụng API. Tệp hình ảnh chắc chắn hợp lệ vì nó có thể được tải với file_get_contents(realpath("image.png")).

Tôi đã thử giải pháp này, sử dụng curl, mà hoạt động hoàn hảo: Upload Photo To Album with Facebook's Graph API

$args = array(
    'message' => 'Photo from application', 
    'pic.png' => '@'.realpath('pic.png') 
); 
$tok = $session['access_token'] 
$url = 'http://graph.facebook.com/'.$album_id.'/photos?access_token='.$tok; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
$data = curl_exec($ch); 

So với PHP SDK curl của Facebook mà trông như thế này (sử dụng args $ cùng và $ url):

$ch = curl_init(); 
$opts = self::$CURL_OPTS; 
$opts[CURLOPT_POSTFIELDS] = http_build_query($args, null, '&'); 
$opts[CURLOPT_URL] = $url; 
curl_setopt_array($ch, $opts); 
$data= curl_exec($ch); 

Tại sao phiên bản PHP không hoạt động? Có vẻ như hàm http_build_query() đang can thiệp vào việc tải hình ảnh. Tôi không biết đủ về việc cuộn tròn để hiểu chuyện gì đang xảy ra ở đây.

Trả lời

12

Tôi rất vui vì tôi đã gặp vấn đề tương tự Bạn phải đặt thông số tải tệp lên thành đúng!

$facebook = new Facebook(array(
      'appId' => $facebookapi_id, 
      'secret' => $facebookapi_secret, 
      'fileUpload' => true, 
      'cookie' => true 
     )); 
+0

Cảm ơn bạn rất nhiều vì đã lưu tôi sau một thời gian dài tìm kiếm – Lobe

+0

Nếu bạn sử dụng điều này, hãy lưu ý rằng người dùng tạo thư có thể tạo các tệp tải lên không chủ định hoặc độc hại. – peterjwest

+0

Cảm ơn! Bạn sẽ nghĩ rằng điều này sẽ nổi bật trong tài liệu tải lên ảnh. . . WTH !!! – TuK

1

Facebook đã cố ý chuyển đổi trường POST thành chuỗi GET bằng cách sử dụng http_build_query() để dừng các trường bắt đầu bằng @ đang được sử dụng để vô tình hoặc độc hại tải tệp lên. Here's the GitHub issue.

Khắc phục nhanh của việc này là để loại bỏ các http_build_query() từ src/facebook.php trong SDK:

$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&'); 

trở thành:

$opts[CURLOPT_POSTFIELDS] = $params; 

Tuy nhiên nếu bạn làm điều này bạn nên có hành động để lọc thư do người dùng tạo bắt đầu bằng @. Ví dụ: bạn có thể thêm dấu cách vào trước mỗi thư.

Các vấn đề liên quan