节点上载的图像保存-流与缓冲区

xa9qqrwz  于 2021-09-23  发布在  Java
关注(0)|答案(0)|浏览(121)

我正在进行图像上传,不知道如何正确处理存储收到的文件。若文件真的是图像或者有人刚更改了扩展名,那个么最好先分析一下。幸运的是,我使用的软件包夏普正是这样一个功能。我目前使用两种方法。
缓冲方法
我可以将多部分表单解析为缓冲区,并轻松决定是否保存文件。

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中。但另一方面,使用流的方法似乎非常笨拙。
有人能帮助我了解这两种方法在性能和使用的资源方面的差异吗?还是有更好的方法来处理这种情况?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题