如何使用Parse Cloud Code下载图像并将其保存在阵列中?

维克托

我将Parse.com用作iOS应用程序的后端服务,并且有一列将来自Facebook的个人资料图片作为URL存储在数组中。

像这样:

[
    "https://z-1-scontent.xx.fbcdn.net/hp...e=5737C2D1",
    "http://files.parsetfss.com/9b0a70...40906b-newProfilePic.png",
    "http://files.parsetfss.com/9b0a70...24dd6-newProfilePic.png"
]

这些URL有时会过期(由于Facebook规则所致),并且不包含图像。互联网的其他方面也不建议像这样存储个人资料图片。

因此,我想做的是制作一个Parse Cloud Code Javascript,通过从URL下载图像并将其作为Parse文件保存在新列中的新数组中,从而将个人资料图片URL迁移为真实图像文件。

这是我想做的:

  • 查询Parse中的所有用户
  • 获取他们的个人资料图片网址
  • 从每个URL下载图像
  • 创建一个图像文件
  • 将图像添加到新数组
  • 将该数组保存给用户

我希望这是有道理的。我创建了一个Cloud Code函数,如下所示:

Parse.Cloud.define(“ migrateColumn”,函数(请求,响应){

Parse.Cloud.useMasterKey();

var usersToSave = [];
var profileImages = [];

var userQuery = new Parse.Query("User");
userQuery.find().then(function(users) {

    for (var a = 0; a < users.length; a++) {
          var user = users[a];
          var profileURLs = user.get("profilePictures");

          for (var b = 0; b < profileURLs.length; b++) {
              var url = profileURLs[b];

              Parse.Cloud.httpRequest({
                    url: url
              }).then(function(httpResponse) {
                  var imageBuffer = httpResponse.buffer;
                  var base64 = imageBuffer.toString("base64");
                  var file = new Parse.File("userProfileImage.png", { base64: base64 });

                  profileImages.push(file);
              });
          }

      user.set("profileImages", ["profileImage" + (a + 1)]);
      usersToSave.push(user);
    }
}).then(function() {
    Parse.Object.saveAll(usersToSave, {
        success: function() {
            response.success("Success : " + profileImages);

        }, error: function(error) {
            response.error("An error occurred : " + error.message);
        }
    });
});

});

我了解该操作httpRequest是异步完成的,因此我需要以Promise某种方式实现,以等待所有图像完成下载。我对Javascript的了解不足,无法自行构造它。感谢所有帮助。

姓名

您走在正确的轨道上。如果您创建执行逻辑任务并返回承诺的函数,一切将变得更加简单。例如,使用单个网址并返回单个PFFile的函数怎么样?

function fileFromUrl(url, name) {
    return Parse.Cloud.httpRequest({url: url}).then(function(httpResponse) {
        var imageBuffer = httpResponse.buffer;
        var base64 = imageBuffer.toString("base64");
        var file = new Parse.File(name, { base64: base64 });
        // edit - pretty sure file.save resolves to file, but just in case...
        return file.save().then(function() { return file; });
    }, function(error) {
        // can't fetch the image for some reason
        // ideas:
        return null; // and have your UI check for nulls in the user image array
        // or return cannedImage(); where this function returns a promise 
        // for a PFFile that already exists
    });
}

现在,编写针对URL数组执行此操作的过程更容易...

var _ = require('underscore');
function function filesFromUrls(urls) {
    var promises = _.map(urls, function (url, index) {
        return fileFromUrl(url, ''+index);
    });
    return Parse.Promise.when(promises).then(function() {
        return _.toArray(arguments);
    });
}

现在,对于用户而言,这样做更容易...

function convertUrlsToFilesForUser(user) {
    var profileURLs = user.get("profilePictures");
    return filesFromUrls(profileURLs).then(function(files) {
        // profileImages should be an array of PFFiles, not an array of arrays as you have it
        user.set("profileImages");
        return user.save();
    });
}

现在很容易在云功能中执行此操作...

var userQuery = new Parse.Query("User");
userQuery.find().then(function(users) {
    var promises = _.map(users, function(user) {
        return convertUrlsToFilesForUser(user);
    });
    return return Parse.Promise.when(promises);
}).then(function(result) {
    response.success(result);
}, function(error) {
    response.error(error);
});

注意事项:我没有测试此代码。此处要做的只是重组操作以简化并正确使用Promise。在这些操作中,我使用了您的代码,但也没有进行测试。

我更改的一个设计元素是您似乎要保存一个数组数组profileImages,例如:[ [ PFFile, '0'], [ PFFile, '1'], ...我将其更改为仅一个PFFiles数组。我想您希望第二个元素像文件名一样。我在PFFile的构造函数中添加了它所属的名称(该文件的名称并不重要,因为它只会影响该文件的半透明url,无论如何该URL解析都会使它唯一)。

最后的警告获取大量用户,然后获取大量图像,然后进行大量保存很容易超时。您可能需要在小批用户中运行此程序,以避免超时。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Parse Cloud Code中使用curl -u?

来自分类Dev

如何从url下载图像并将其保存到使用javascript的本地目录中?

来自分类Dev

如何从图库中获取图像,裁剪图像并将其保存在应用程序中

来自分类Dev

在php中,如何从外部网站下载图像并将其保存到我的网站中?

来自分类Dev

如何从URL下载图像并将其保存到计算机中?

来自分类Dev

使用Parse Cloud保存解析用户

来自分类Dev

使用AFHTTP下载图像并将其保存到ALAsset

来自分类Dev

在Parse Cloud Code(Javascript)中从阵列中删除对象

来自分类Dev

使用Parse Code Cloud Javascript函数更改Parse列的值

来自分类Dev

如何在图像上绘制矩形并将其保存在VB.Net中

来自分类Dev

如何合并带线的图像并将其保存在文件中?

来自分类Dev

如何将图像插入背景并将其保存在JAVA中?

来自分类Dev

如何合并带线的图像并将其保存在文件中?

来自分类Dev

如何从url获取图像并将其保存在mysql中作为BLOB?的PHP

来自分类Dev

如何在Parse Cloud Code中使require()使用node_modules?

来自分类Dev

如何使用explode()值并将其保存在变量中?

来自分类Dev

如何在Parse Cloud Code中访问Facebook Graph API?

来自分类Dev

将指针与objectId保存在Parse.Cloud中

来自分类Dev

使用 Django 将 html5 画布加载到 PIL 图像中并将其保存在新文件中

来自分类Dev

使用 Parse Cloud 代码在 Heroku 文件系统中保存文件?

来自分类Dev

如何下载AssetBundle,然后将其保存在设备中

来自分类Dev

如何将图像视图传递到另一个布局并将其保存在布局中?

来自分类Dev

如何比较Parse Cloud中的2个Date字段?

来自分类Dev

如何在Parse cloud Javascript SDK中创建此查询?

来自分类Dev

如何在Parse cloud Javascript SDK中创建此查询?

来自分类Dev

Parse Cloud Code deploy not possible

来自分类Dev

如何设置图像,以便将其保存在swift 2中

来自分类Dev

如何使用 angular 2 和 typescript 裁剪图像、调整裁剪框的大小并将其保存在另一个画布中

来自分类Dev

如何在移动设备(Android,iPhone,Windows)中下载base-64源图像并将其保存到设备手机内存中

Related 相关文章

  1. 1

    如何在Parse Cloud Code中使用curl -u?

  2. 2

    如何从url下载图像并将其保存到使用javascript的本地目录中?

  3. 3

    如何从图库中获取图像,裁剪图像并将其保存在应用程序中

  4. 4

    在php中,如何从外部网站下载图像并将其保存到我的网站中?

  5. 5

    如何从URL下载图像并将其保存到计算机中?

  6. 6

    使用Parse Cloud保存解析用户

  7. 7

    使用AFHTTP下载图像并将其保存到ALAsset

  8. 8

    在Parse Cloud Code(Javascript)中从阵列中删除对象

  9. 9

    使用Parse Code Cloud Javascript函数更改Parse列的值

  10. 10

    如何在图像上绘制矩形并将其保存在VB.Net中

  11. 11

    如何合并带线的图像并将其保存在文件中?

  12. 12

    如何将图像插入背景并将其保存在JAVA中?

  13. 13

    如何合并带线的图像并将其保存在文件中?

  14. 14

    如何从url获取图像并将其保存在mysql中作为BLOB?的PHP

  15. 15

    如何在Parse Cloud Code中使require()使用node_modules?

  16. 16

    如何使用explode()值并将其保存在变量中?

  17. 17

    如何在Parse Cloud Code中访问Facebook Graph API?

  18. 18

    将指针与objectId保存在Parse.Cloud中

  19. 19

    使用 Django 将 html5 画布加载到 PIL 图像中并将其保存在新文件中

  20. 20

    使用 Parse Cloud 代码在 Heroku 文件系统中保存文件?

  21. 21

    如何下载AssetBundle,然后将其保存在设备中

  22. 22

    如何将图像视图传递到另一个布局并将其保存在布局中?

  23. 23

    如何比较Parse Cloud中的2个Date字段?

  24. 24

    如何在Parse cloud Javascript SDK中创建此查询?

  25. 25

    如何在Parse cloud Javascript SDK中创建此查询?

  26. 26

    Parse Cloud Code deploy not possible

  27. 27

    如何设置图像,以便将其保存在swift 2中

  28. 28

    如何使用 angular 2 和 typescript 裁剪图像、调整裁剪框的大小并将其保存在另一个画布中

  29. 29

    如何在移动设备(Android,iPhone,Windows)中下载base-64源图像并将其保存到设备手机内存中

热门标签

归档