如何使用 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--");
}
});
所以为了稍微分解一下,我首先做的是获取 obj
和 objOriginal
,这样我就可以比较它们并检查特定字段中的更改。这个条件是必要的,因为在我的例子中,我想在解析中保存调整大小的 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' }
很重要。
最后我只保存了文件和对象。这是最好的方法吗,绝对不是,但这是我发现可行的方法。另一种可能的解决方案是不使用 buffers
和 base64
而是创建一个临时目录,将图像保存在那里,使用它们,然后删除该目录。我也试过了,但在运行时遇到了问题。
我有一个 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--");
}
});
所以为了稍微分解一下,我首先做的是获取 obj
和 objOriginal
,这样我就可以比较它们并检查特定字段中的更改。这个条件是必要的,因为在我的例子中,我想在解析中保存调整大小的 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' }
很重要。
最后我只保存了文件和对象。这是最好的方法吗,绝对不是,但这是我发现可行的方法。另一种可能的解决方案是不使用 buffers
和 base64
而是创建一个临时目录,将图像保存在那里,使用它们,然后删除该目录。我也试过了,但在运行时遇到了问题。