【问题标题】:How do I temporarily store facebook profile picture?如何临时存储 facebook 头像?
【发布时间】:2011-05-02 17:30:35
【问题描述】:

嘿,伙计们,我正在尝试构建一个小应用程序,它可以提取用户的个人资料图片,允许他们操作图片,然后将修改后的图片发布到他们的个人资料图片相册(理想情况下设置为他们的个人资料图片,但我没有'认为这不可能???)。

我遇到的问题是,除非图像是本地的,否则我用来更改图像的 javascript 将无法工作

<img src="http://profile.ak.fbcdn.net/hprofile-ak-snc4/[some_user_id].jpg" /> 不起作用,但 <img src="img/image.jpg" /> 会...

有什么方法可以实现吗?

我用来获取用户图片的方法是这样的:

要连接到 Facebook:

<?php
require_once 'library/facebook.php';

$app_id = "###";
$app_secret = "###";

$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $app_secret,
    'cookie' => true
));

if(is_null($facebook->getUser()))
{
    header("Location:{$facebook->getLoginUrl(array('req_perms' => 'user_status,publish_stream,user_photos'))}");
    exit;
}

然后显示图片:

<?php

$aResponse = $facebook->api('/me', array(
    'fields' => 'picture',
    'type' => 'large'
));
echo "<img src='".$aResponse["picture"]."' />";
?>

非常感谢!

【问题讨论】:

  • 有浏览器安全规则来访问从一个单独的域中获取的图像中的图像数据。

标签: php javascript facebook facebook-graph-api


【解决方案1】:

为自己编写一个代理图像服务器,它将您要操作的图像作为查询参数并仅输出图像内容。它比直接访问用户的图片要慢一些,但如果您有创意,您可以在本地缓存该图片以加快后续加载速度。

一个简单的方法是这样的:

前端:

<img src="image_server.php?img=<?= urlencode($aResponse['picture']); ?>">

后端:

<?php
if (!empty($_GET['img']))
{
    //make sure this is a file on the facebook content delivery network
    //and not our /etc/passwd or database connection config, or something
    //else completely malicious.
    if (preg_match("#^https?://profile\.ak\.fbcdn\.net/#i", $_GET['img']))
    {
        $img_path = $_GET['img'];
    }
    else
    {
        //do something with someone that entered a bad image, probably just
        //display a "no image" image.
        die('bad user. bad.');
    }

    readfile($img_path);
    exit;
}
else
{
    //no image was specified. output an anonymous/no image image.
    die('an image file must be specified.');
}

您可能想要比这更复杂一点……但这是基本要点。

注意: php 代码假定您在 php.ini 中启用了 fopen 包装器(因此您可以包含 web url)。

【讨论】:

  • 谢谢吉姆!但是,我同时以另一种方式解决了它,请在下面查看我的答案。非常感谢!
【解决方案2】:

感谢 Jim 的回复,我曾看到有人在做与此非常相似的事情,但再次(只是我的运气)我遇到了问题。无论如何,我设法解决的方法是:

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

// This is just pulling the user id to use for the filename
$id = $get_id['id'];

save_image($aResponse['picture'],'tmp/'.$id.'.jpg');

【讨论】:

    【解决方案3】:
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
    
    function curl_redir_exec($ch)
        {
            static $curl_loops = 0;
            static $curl_max_loops = 20;
            if ($curl_loops++ >= $curl_max_loops)
            {
                $curl_loops = 0;
                return FALSE;
            }
            curl_setopt($ch, CURLOPT_HEADER, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $data = curl_exec($ch);
            @list($header, $data) = @explode("\n\n", $data, 2);
            $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            if ($http_code == 301 || $http_code == 302)
            {
                $matches = array();
                preg_match('/Location:(.*?)\n/', $header, $matches);
                $url = @parse_url(trim(array_pop($matches)));
                if (!$url)
                {
                    //couldn't process the url to redirect to
                    $curl_loops = 0;
                    return $data;
                }
                $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
                if (!$url['scheme'])
                    $url['scheme'] = $last_url['scheme'];
                if (!$url['host'])
                    $url['host'] = $last_url['host'];
                if (!$url['path'])
                    $url['path'] = $last_url['path'];
                $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . (@$url['query']?'?'.$url['query']:'');
                return $new_url;
            } else {
                $curl_loops=0;
                return $data;
            }
        }
    
        function get_right_url($url) {
            $curl = curl_init($url);
            curl_setopt($curl, CURLOPT_HEADER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            return curl_redir_exec($curl);
        }
    
    
    
    
        $url = 'http://graph.facebook.com/' . $fbid . '/picture?type=large';
    
        $file_handler = fopen('/img/avatar/'.$fbid.'.jpg', 'w');
        $curl = curl_init(get_right_url($url));
        curl_setopt($curl, CURLOPT_FILE, $file_handler);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_exec($curl);
    
        curl_close($curl);
        fclose($file_handler);
    

    // 快乐编码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多