节点上传图像保存 - 流 vs 缓冲区

问题描述

我正在上传图片,但不知道如何正确处理接收到的文件。如果文件确实是图像或某人刚刚更改了扩展名,最好先分析文件。幸运的是,我使用的包 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 中。但另一方面,使用流的方法似乎非常笨拙。

有人可以帮助我了解这两种方法性能和使用资源方面有何不同吗?或者有什么更好的方法来处理这种情况?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)