Облачный код: создание Parse.File из URL-адреса

Я работаю над функцией облачного кода, которая использует API-интерфейс facebook для получения изображения профиля пользователя. Итак, у меня есть доступ к правильному URL-адресу изображения, но я не могу создать Parse.File из этого URL-адреса.

Это в значительной степени то, что я пытаюсь:

    Parse.Cloud.httpRequest({
        url: httpResponse.data["attending"]["data"][key]["picture"]["data"]["url"],
        success: function(httpImgFile) 
        {
            var imgFile = new Parse.File("file", httpImgFile);                                             
            fbPerson.set("profilePicture", imgFile); 
        },
        error: function(httpResponse) 
        {
            console.log("unsuccessful http request");
        }
    });

И он возвращает следующее:

Result: TypeError: Cannot create a Parse.File with that data.
    at new e (Parse.js:13:25175)
    at Object.Parse.Cloud.httpRequest.success (main.js:57:26)
    at Object.<anonymous> (<anonymous>:842:19)

Идеи?


person adolfosrs    schedule 15.11.2015    source источник


Ответы (1)


У меня была проблема с этой же проблемой прямо сейчас. По какой-то причине этот вопрос уже занимает первое место в результатах поиска Google по запросу parsefile from httprequest buffer!

В документации Parse.File говорится

Данные для файла в виде 1. массива байтовых значений чисел или 2. объекта, например { base64: "..." } со строкой в ​​кодировке base64. 3. объект File, выбранный с помощью элемента управления загрузкой файла. (3) работает только в Firefox 3.6+, Safari 6.0.2+, Chrome 7+ и IE 10+.

Я считаю, что для CloudCode самым простым решением является 2. Раньше меня сбивало с толку то, что я не заметил, что он ожидает Object с форматом { base64: {{your base64 encoded data here}} }.

Также Parse.Files можно установить на Parse.Object только после сохранения (такое поведение также присутствует во всех клиентских SDK). Я настоятельно рекомендую использовать Promise версию API, так как она значительно упрощает создание таких асинхронных операций.

Итак, следующий код решит вашу проблему:

Parse.Cloud.httpRequest({...}).then(function (httpImgFile) {
    var data = {
        base64: httpImgFile.buffer.toString('base64')
    };
    var file = new Parse.File("file", data);
    return file.save();
}).then(function (file) {
  fbPerson.set("profilePicture", file);
  return fbPerson.save();
}).then(function (fbPerson) {
  // fbPerson is saved with the image
});
person paolobueno    schedule 17.11.2015
comment
Спасибо Паоло, сработало хорошо. Как насчет помощи в этом: perfo" title="проверка уникальности при пакетном сохранении с огромным количеством анализируемых объектов perfo">stackoverflow.com/questions/33762391/ Valeu! оттенок - person adolfosrs; 18.11.2015
comment
Вы можете установить несохраненный PFFile на PFObject iOS и сохранить его при сохранении PFObject. - person cncool; 19.12.2015
comment
Это было спасением для меня. Я пытался вернуть байтовые данные клиенту Android, и это сработало отлично. Вернувшись на Android, я извлек подобное. byte[] imgBytes = Base64.decode(объект, Base64.DEFAULT); - person Tanzim Chowdhury; 28.06.2020