我正在使用facebook connect来获取用户个人资料图片的应用程序。但在建立连接后,我仍然必须能够裁剪并调整“大”图像的大小。因此,我想从Facebook服务器下载个人资料图片到我自己的服务器。
截至目前,我无法将图片下载到我的服务器。这就是我在做的事情:
问题
•那么我们如何使用此路径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的代码不起作用。我该怎么做才能解决这个问题?
答案 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裁剪图像会更有意义。