如何使用 sharp 库调整 Parse 文件 img 的大小?

How to use the sharp library to resize a Parse file img?

我有一个 Parse Cloud afterSave 触发器,我可以从那里访问 obj,并且在 obj 内部有一个字段,该字段具有存储解析文件 img。

我想使用 sharp 调整它的大小并将其保存在另一个字段中,但是我在使用 sharp 时遇到了错误。以下是我在云触发器中已有的代码摘要:

let file = obj.get("photo");

        sharp(file)
            .resize(250, 250)
            .then((data) => {
                console.log("img-----", data);
            })
            .catch((err) => {
                console.log("--Error--", err);
            });

经过一些研究,我设法弄清楚了如何创建 Parse Cloud afterSave 触发器,它会调整大小然后保存 img,我找不到太多关于它的信息,所以很糟糕 post 我的解决方案,以便其他人可以有帮助就采纳吧。

Parse.Cloud.afterSave("Landmarks", async (req) => {
    const obj = req.object;
    const objOriginal = req.original;

    const file = obj.get("photo");
    const condition = file && !file.equals(objOriginal.get("photo"));

    if (condition) {

        Parse.Cloud.httpRequest({ url: file.url() })
            .then((res) => {

                sharp(res.buffer)
                    .resize(250, 250, {
                        fit: "fill",
                    })
                    .toBuffer()
                    .then(async (dataBuffer) => {
                        const data = { base64: dataBuffer.toString("base64") };

                        const parseFile = new Parse.File(
                            "photo_thumbnail",
                            data
                        );
                        await parseFile.save();
                        await obj.save({ photo_thumb: parseFile });
                    })
                    .catch((err) => {
                        console.log("--Sharp-Error--", err);
                    });

            })
            .catch((err) => {
                console.log("--HTTP-Request-Error--", err);
            });

    } else {
        console.log("--Photo was deleted or did not change--");
    }
});

所以为了稍微分解一下,我首先做的是获取 objobjOriginal,这样我就可以比较它们并检查特定字段中的更改。这个条件是必要的,因为在我的例子中,我想在解析中保存调整大小的 img,否则会导致无限循环。

之后我做了 Parse.Cloud.httpRequest({ url: file.url()}).then(),这是我发现从 photo 获取缓冲区的方法。缓冲区存储在 res.buffer 中,我们需要它来进行锐化。

接下来我使用 sharp(res.buffer) 因为 sharp 也接受缓冲区并将其大小调整为所需的尺寸(我使用了合适的配置)。然后我们使用 .toBuffer() 将结果 img 转换为另一个缓冲区。此外,我使用 .then().catch() 块,如果 sharp 成功,我将输出缓冲区转换为 base64 并将其传递给 Parse.File(),请注意特定语法 { base64: 'insert buffer here' } 很重要。

最后我只保存了文件和对象。这是最好的方法吗,绝对不是,但这是我发现可行的方法。另一种可能的解决方案是不使用 buffersbase64 而是创建一个临时目录,将图像保存在那里,使用它们,然后删除该目录。我也试过了,但在运行时遇到了问题。