【发布时间】:2021-10-02 17:20:03
【问题描述】:
我正在处理图片上传,但不知道如何正确处理接收到的文件的存储。如果文件确实是图像或有人刚刚更改了扩展名,那么首先分析文件会很好。幸运的是,我使用了 sharp 包,它恰好具有这样的功能。我目前使用两种方法。
缓冲方法
我可以将多部分表单解析为缓冲区并轻松决定是否保存文件。
const metadata = await sharp(buffer).metadata();
if (metadata) {
saveImage(buffer);
} else {
throw new Error('It is not an image');
}
流式方法
我可以将多部分表单解析为可读流。首先,我需要将可读流转发到可写并将文件存储到磁盘。之后,我需要再次从保存的文件中创建一个可读流并验证它是否真的是图像。否则,全部还原。
// save uploaded file to file system with stream
readableStream.pipe(createWriteStream('./uploaded-file.jpg'));
// verify whether it is an image
createReadStream('./uploaded-file.jpg').pipe(
sharp().metadata((err, metadata) => {
if (!metadata) {
revertAll();
throw new Error('It is not an image');
}
})
)
我打算避免使用缓冲区,因为我知道它需要将整个文件存储在 RAM 中。但另一方面,使用流的方法似乎非常笨拙。
谁能帮助我了解这两种方法在性能和使用资源方面有何不同?或者有没有更好的方法来处理这种情况?
【问题讨论】:
标签: node.js file-upload buffer node-streams