Сохранить Facebook подключить изображение профиля на свой сервер - PullRequest
1 голос
/ 18 июля 2011

Я работаю в приложении, которое использует Facebook Connect для получения изображения профиля пользователя. Но после того, как соединение установлено, мне все еще нужно будет обрезать и изменить размер «большого» изображения. Поэтому я хочу загрузить изображение профиля с сервера facebook на свой сервер.

На данный момент я не могу загрузить изображение на свой сервер. Вот что я делаю:

  1. Изображение профиля на Facebook синхронизируется в нашем приложении с Facebook по следующему пути http://graph.facebook.com/uid/picture?type=large
  2. Теперь нам нужно, чтобы изображение было сохранено локально с указанного выше URL.
  3. Обрежьте его и отобразите, но мы не можем сохранить изображение с предоставленного URL

Вопрос

• Итак, как мы можем сохранить изображение профиля facebook на нашем сервере, используя этот путь http://graph.facebook.com/uid/picture?type=large?
• Или какое другое решение сохранить профиль в Facebook? Изображение, которое нужно сохранить на нашем сервере перед его отображением?
• Как мы по-прежнему синхронизируем его с Facebook, если используем сохраненное изображение?

Тогда у меня есть еще один вопрос:
Как вы удаляете куки для когда-то установленных соединений Facebook facebook, если пользователь больше не хочет использовать Facebook Connect? Если вы пытались сделать это с помощью следующего кода, но безрезультатно:

    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 ]

2 голосов
/ 21 июля 2011

Вы, вероятно, должны разделить свои вопросы на отдельные вопросы, но, как другие имеют указал , https://graph.facebook.com/me/picture вернет перенаправление 302 наURL изображения, который вы можете сохранить на своем сервере, поэтому вам нужно убедиться, что вы либо следите за перенаправлением, либо читаете заголовок Location (подробнее о том, как это сделать здесь ), чтобы получить URIфактическое изображение.

Что касается вашего вопроса о том, как убедиться, что вы всегда используете самое последнее изображение, вы должны подписаться на соединение "/ picture" объекта "Пользователь", используя Real-time Updates , и мы будем проверять ваш обратный вызов всякий раз, когда любой пользователь вашего приложения обновляет свою картинку, чтобы вы могли получить самую последнюю.Таким образом, вам не нужно будет продолжать опрос, чтобы увидеть, изменил ли пользователь свою картинку.

Если вы можете достичь того, чего хотите, с помощью только CSS (без самостоятельного кэширования картинки)сервер), проверьте решение Squinlan .

2 голосов
/ 19 июля 2011

Как OffBySome сказал выше , ключ знает, что он перенаправит вас.Итак, мы автоматически отключаем после перенаправления и получаем фактический URL-адрес изображения из заголовка URL-адреса профиля.Вот фрагмент, который я использовал для загрузки самого файла изображения.Доступный как суть здесь: 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 голосов
/ 19 июля 2011

Вместо сохранения всех фотографий профиля вы можете отобразить фотографию в виде 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 голос
/ 19 июля 2011

Когда вы пытаетесь загрузить изображение, убедитесь, что то, с чем вы загружаете изображение, может следовать перенаправлениям 302, потому что графическая ссылка Facebook возвращает только перенаправление на изображение, а не само изображение. Но обрезка изображения с помощью CSS будет иметь больше смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...