我有一个web应用程序,它接收用户上传的图像,将其上传到S3 (通过multer-s3)并获取url,通过一个名为"sharp“的模块收集一些元数据(即维度、mime类型等),然后将这些信息写入db。
这些是非常高分辨率的照片(从2到19毫巴),我不知道什么是最好的处理方法。我是应该在第一次获得文件时将它们写入文件,然后从文件中流出来,还是应该继续将其保存在内存中直到完成为止。
上传后的部分,我通过锐利运行图像,是最让我担心的部分。由于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)));
});
}
上面的片段与另外两个异步函数同时运行,结果被插入到db中。我做错了吗?写到本地文件并指向该文件更好吗?
谢谢你的建议
发布于 2017-09-02 19:27:28
sharp
支持基于承诺的(即异步/等待)输出的基于流的输入。
下面是您的示例的修改版本,以演示如何实现这一目标。
async getImageDimensions(fileStream){
const writableStream = sharp();
fileStream.pipe(writableStream);
const metadata = await writableStream.metadata();
return {width: metadata.width, height: metadata.height};
}
在方法上,metadata()
不解码任何像素数据,通常是任何图像文件的大部分,因此您可以尝试截断fileStream
,因为尺寸已经接近开始。
https://stackoverflow.com/questions/45924769
复制相似问题