node.js 图片上传最佳方法

node.js image upload best approach

我有一个 Web 应用程序,它获取用户上传的图像,将其上传到 S3(通过 multer-s3)并获取 url,通过名为 [=22 的模块从中收集一些元数据=](即尺寸、MIME 类型等),然后将此信息写入数据库。

这些是非常高分辨率的照片(从 2 到 19 mb),我不确定处理它们的最佳方式是什么。我应该在第一次获取它们时将它们写入文件,然后从那里流式传输,还是应该继续将其保存在内存中直到完成。

上传后的部分,我运行通过锐化的图像,是我最担心的部分。因为 sharp 无法处理流,所以我将流转换为缓冲区:

async getImageDimensions(fileStream){
  let buffer = await this._streamToBuffer(fileStream);
  let metadata = await sharp(buffer).metadata();
  return {width: metadata.width, height: metadata.height};
}

_streamToBuffer(stream){
  return new Promise((resolve, reject) => {
    let buffers = [];
    stream.on('error', reject);
    stream.on('data', (data) => buffers.push(data));
    stream.on('end', () => resolve(Buffer.concat(buffers)));
  });
}

上面的代码片段同时 运行s 与另外两个异步函数,并将结果插入到 db 中。我做错了吗?写入本地文件并指向该文件会更好吗?

感谢您的建议

sharp 支持基于流的输入和基于 Promise(即 async/await)的输出。

这是您示例的修改版本,用于演示如何实现这一点。

async getImageDimensions(fileStream){
    const writableStream = sharp();
    fileStream.pipe(writableStream);
    const metadata = await writableStream.metadata();
    return {width: metadata.width, height: metadata.height};
}

就方法而言,metadata() 不解码任何像素数据,通常是任何图像文件的大部分,因此您可以尝试截断 fileStream,因为尺寸接近开始。