0

Cloud Modules Guideに従って、Parse Cloud Code で画像のサイズを変更しようとしています。

基本的な考え方は次のとおりです。ユーザーに対して afterSave が呼び出されたときに、小さいプロファイルの pic が null であり、標準のプロファイル pic が null でないかどうかを確認します。true の場合、Parse から標準のプロファイル写真を取得し、バッファに読み込み、ファイルを作成し、ファイルを保存してから、ファイルを User に追加して保存します。残念ながら、ファイルは正しく保存されていないようです。

クラウド afterSave 関数は次のとおりです。

    Parse.Cloud.afterSave(Parse.User, function(request) {

    ...

        Parse.Cloud.httpRequest({
        url: request.object.get("profilePicture").url(),
        success: function(response) {
            // The file contents are in response.buffer.

            var image = new Image();
            console.log("Buffer: " + response.buffer );
            console.log("Length " + response.buffer.length);
            image.setData(response.buffer);
            var imgData = image.data();


            // Save the image into a new file.
            var base64 = imgData.toString("base64");
            var scaled = new Parse.File("thumbnail.png", { base64: base64 });
            scaled.save().then(function() {
                request.object.set("profilePictureSmall", scaled);
                request.object.save();
            }, function(error) {
                console.log( "The file either could not be read, or could not be saved to Parse.");
            });
        }
    });
    ...
});

User オブジェクトは正常に保存されているようですが、保存された画像ファイルは壊れた画像です。

奇妙なことはconsole.log("Length " + response.buffer.length);、適切なサイズをコンソールに出力することです。

console.log("Buffer: " + response.buffer );出力を与えます:�PNG

ここで何が起こっているのか分かりますか?

4

1 に答える 1

4

問題はsetData()、非同期呼び出しであることです。次のビットを実行する前に、それが完了するまで待つ必要があります。

http://parse.com/docs/js/symbols/Image.html#setData

ここにスニペットがあります:

Parse.Cloud.httpRequest({
    url: request.object.get("profilePicture").url()
}).then(function(response) {
    var image = new Image();
    return image.setData(response.buffer);
}).then(function(image) {
    // make it fit in 100x100
    var width = 100, height = 100;
    if (image.width() > image.height()) {
        // work out scaled height
        height = image.height() * (100/image.width());
    } else {
        // work out scaled width
        width = image.width() * (100/image.height());
    }
    console.log("..scale to " + width + "x" + height);
    return image.scale({
        width: width,
        height: height
    });
}).then(function(scaledImage) {
    // get the image data in a Buffer
    return scaledImage.data();
}).then(function(buffer) {
    // save the image to a new file
    console.log("..saving file");
    var base64 = buffer.toString("base64");
    var name = "Thumbnail.png";
    var thumbnail = new Parse.File(name, { base64: base64 });
    return thumbnail.save();
}).then(function(thumbnail) {
    // attach the image file to the original object
    console.log("..attaching file");
    request.object.set("profilePictureSmall", thumbnail);
    return request.object.save();
}) /* further chaining here for after-save */;

基本的に、前のステップを完了できるようにするには、約束を連鎖させる必要があります。

于 2014-11-21T01:07:35.043 に答える