将facebook连接个人资料图片保存到自己的服

时间:2011-07-18 12:11:22

标签: java facebook facebook-graph-api

我正在使用facebook connect来获取用户个人资料图片的应用程序。但在建立连接后,我仍然必须能够裁剪并调整“大”图像的大小。因此,我想从Facebook服务器下载个人资料图片到我自己的服务器。

截至目前,我无法将图片下载到我的服务器。这就是我在做的事情:

  1. Facebook个人资料图片在我们的应用程序中从facebook获得同步,路径为http://graph.facebook.com/uid/picture?type=large
  2. 现在我们需要从上面提到的URL本地保存图像
  3. 裁剪并显示它,但我们无法从提供的网址中保存图像
  4. 问题

    •那么我们如何使用此路径http://graph.facebook.com/uid/picture?type=large在我们的服务器中保存Facebook个人资料图片? •或者保存Facebook个人资料的其他解决方案是什么?在显示之前先将图片保存在我们的服务器中? •如果我们使用保存的图片,我们如何仍然与Facebook保持同步?

    然后我有另一个问题:
    如果用户不想再使用facebook连接,如何删除曾经建立的facebook连接的cookie? 如果尝试使用以下代码执行此操作但没有结果:

        var api_key = "135xxxxxxxxxxx";
        var channel_path = ""+2;
        FB.init(api_key , cookie:false, channel_path, { "ifUserConnected": update_user_box });
        Function update_user_box(){
        Var fbId=FB.Connect.get_loggedInUser();
    

    上面给出的删除假cookie的代码不起作用。我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:2)

您可以在div中显示照片,而不是保存所有个人资料照片,而div对整个图像来说太小了。基本上让html进行裁剪。

<body>
     <div style="background-image: url(http://scm-l3.technorati.com/11/01/14/25023/facebook-logo.jpg); width: 380px; height: 300px;">
 </div>
</body>

或者,根据我在下面的评论,您可以包装图像并调整div的大小。两种选择都有效。一个避免使用CSS url(),在极少数情况下可能不会遵循重定向。

<body>
     <div style="width: 380px; height: 300px; overflow: hidden;">
         <img src="http://scm-l3.technorati.com/11/01/14/25023/facebook-logo.jpg" alt="Facebook" />
 </div>
</body>

答案 1 :(得分:2)

就像OffBySome所说above一样,关键是要知道它会重定向你。因此,我们会自动关闭重定向,并从配置文件网址的标题中检索图片的实际网址。这是我用来下载实际图像文件的片段。这里有一个要点:https://gist.github.com/1092990

private static final String PROFILE_PICTURE_URL = "https://graph.facebook.com/%s/picture?type=large&access_token=%s";

private String downloadFacebookProfilePicture(String uid, String accessToken, String username) throws MalformedURLException, IOException {
    //Get the picture url
    HttpURLConnection.setFollowRedirects(false);
    String profilePictureUrlString = new URL(String.format(PROFILE_PICTURE_URL, uid, accessToken)).openConnection().getHeaderField(
            "location");

    //Set up temp location for picture
    String fileExtension = StringUtils.substring(profilePictureUrlString,
            StringUtils.lastIndexOf(profilePictureUrlString, ".") + 1);

    String tempFilePath = (new StringBuilder(String.valueOf(System
            .getProperty("java.io.tmpdir"))))
            .append(StringUtils.replace(username, ".", "_")).append(".")
            .append(fileExtension).toString();

    String exportUrl = profilePictureUrlString;
        //Download file to temp  location
        downloadFile(exportUrl, tempFilePath);

    return tempFilePath;
}

private void downloadFile(String exportUrl, String filepath)
        throws IOException, MalformedURLException {
    InputStream inStream = new URL(exportUrl).openStream();
    FileOutputStream outStream = new FileOutputStream(filepath);
    copyStreams(inStream, outStream);
}

private void copyStreams(InputStream inStream, OutputStream outStream)
        throws IOException {
    try {
        int c;
        while ((c = inStream.read()) != -1) {
            outStream.write(c);
        }
    } finally {
        if (inStream != null) {
            inStream.close();
        }
        if (outStream != null) {
            outStream.flush();
            outStream.close();
        }
    }
}

答案 2 :(得分:2)

您可能应该将问题分成单独的问题,但others pointed out时,https://graph.facebook.com/me/picture会将302 redirect返回到您可以保存到服务器的图片网址因此,您需要确保您正在关注重定向或阅读位置标题(有关如何执行此操作的更多信息here)以获取实际图像的URI。

关于如何确保始终使用最新图片的问题,您应该使用Real-time Updates订阅“用户”对象的“/图片”连接,我们会ping你的当应用程序的任何用户更新其图片时回调,以便您可以拉出最新的图片。这样您就不必继续轮询以查看用户是否更改了他们的图片。

如果您只使用CSS(无需在自己的服务器上缓存图片)即可实现目标,请查看squinlan's solution

答案 3 :(得分:1)

当您尝试下载图像时,请确保您下载的图像可以跟随302重定向,因为图表Facebook链接仅返回重定向到图像,而不是实际图像本身。但是使用CSS裁剪图像会更有意义。