Facebook PHP 从内存上传文件


Facebook PHP upload file from memory

我正在从 AWS 中的 S3 存储桶中读取图像,并希望将其上传到 Facebook。

这是读取功能:

/**
 * Get a file from the s3 storage
 */
private function uploadPicture() {
    $picture = new FacebookPicture();
    $file = $this->s3Manager->getFile($this->subEndPoint,$this->verb);
    $picture->pictureContent = $file["Body"];
    $facebookAlbum = new FacebookAlbum();
    $facebookAlbum->album = new Album();
    $facebookAlbum->album->facebookAccessToken = "myAccessToken";
    $facebookAlbum->id = "myAlbumId";
    $facebookManager = new FacebookManager();
    $facebookManager->uploadPicture($facebookAlbum,$picture);
}

这是上传到脸书的功能

/**
 * @param $facebookAlbum FacebookAlbum the album to upload the picture to
 * @param $picture FacebookPicture the picture to upload
 */
public function uploadPicture($facebookAlbum,$picture)
{
    $this->facebook->setAccessToken($facebookAlbum->album->facebookAccessToken);
    $this->facebook->setFileUploadSupport(true);
    $args = array();
    $args["message"] = $picture->description;
    $args["source"] = "@" . $picture->pictureContent;
    $data = $this->facebook->api('/'. $facebookAlbum->id . '/photos', 'post', $args);
    var_dump($data);
}

我不断得到:

curl_setopt_array(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead in <b>acebook-php-sdk-master/src/base_facebook.php</b> on line <b>1005</b><br />

我认为问题是图像内容保存在内存中。

如何使用内存中的变量将其发布到Facebook?

@filename

PHP>= 5.5.0 中已被弃用,如此处CURLOPT_POSTFIELDS描述中所述,所以这就是您出现错误的原因。

您在此堆栈溢出线程中有答案,其中讨论了不同的解决方案。这里也是来自 RFC 的代码片段。

目前,cURL 文件上传按以下方式完成:

 curl_setopt($curl_handle, CURLOPT_POST, 1); 
 $args['file'] = '@/path/to/file';
 curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $args);

此 API 既不可靠又不安全,无法发送 以"@"开头的开机自检数据,以及正在显示的任何用户数据 通过 cURL 重新发送需要清理,以便数据值不会 以 @ 开头。通常,入站信令通常容易受到 各种注射,最好不要以这种方式进行。

而不是使用上述方法,应该使用以下方法来 上传文件CURLOPT_POSTFIELDS

 curl_setopt($curl_handle, CURLOPT_POST, 1); 
 $args['file'] = new
 CurlFile('filename.png', 'image/png'); curl_setopt($curl_handle,
 CURLOPT_POSTFIELDS, $args);