如何使用sharp库调整解析文件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,我找不到关于它的太多信息,所以我无法发布我的解决方案,以便其他人可以在有帮助的情况下使用它。

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' } 很重要。

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