首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >node.js图像上传最佳方法

node.js图像上传最佳方法
EN

Stack Overflow用户
提问于 2017-08-28 17:52:29
回答 1查看 398关注 0票数 0

我有一个web应用程序,它接收用户上传的图像,将其上传到S3 (通过multer-s3)并获取url,通过一个名为"sharp“的模块收集一些元数据(即维度、mime类型等),然后将这些信息写入db。

这些是非常高分辨率的照片(从2到19毫巴),我不知道什么是最好的处理方法。我是应该在第一次获得文件时将它们写入文件,然后从文件中流出来,还是应该继续将其保存在内存中直到完成为止。

上传后的部分,我通过锐利运行图像,是最让我担心的部分。由于sharp不能处理流,所以我将流转换为这样的缓冲区:

代码语言:javascript
运行
复制
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)));
  });
}

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

谢谢你的建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-02 19:27:28

sharp支持基于承诺的(即异步/等待)输出的基于流的输入。

下面是您的示例的修改版本,以演示如何实现这一目标。

代码语言:javascript
运行
复制
async getImageDimensions(fileStream){
    const writableStream = sharp();
    fileStream.pipe(writableStream);
    const metadata = await writableStream.metadata();
    return {width: metadata.width, height: metadata.height};
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45924769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档