我正在通过将每个图像下载到文件系统到 tmp 文件夹中来从节点中的远程文件创建 GIF。
我想绕过将图像保存到 tmp 文件夹并保存在内存中。这可能吗?
如您所见,我的 AWS 类中有一个下载功能,它保存到 tmp 文件夹:
download(key){
return new Promise((resolve, reject) => {
request.head(`${this.base_url}/${this.bucket}/${key}`, (err, res, body) => {
request(`${this.base_url}/${this.bucket}/${key}`)
.pipe(fs.createWriteStream(`tmp/${key}`)).on('close', resolve )
})
})
};
一旦它们全部下载完毕,我的 GifService 类中有一个 createGif 函数,它将每个文件路径添加为自定义参数gm
,添加 50 毫秒的延迟,调整大小然后输出为缓冲区,然后我将其上传到 AWS s3。
import gm from 'gm';
...
constructor(){
this.gm = gm()
}
generateGif(images, prefix){
return new Promise((resolve, reject) => {
// for each image we want in array, we pass to gm
images.forEach(image => {
this.gm.in(`tmp/${image.Key}`)
})
// Now we create the gif with 50sec delay between images, sized to 600px x 2
this.gm
.delay(50)
.resize(600,600)
.toBuffer('gif', async (err, buffer) => {
if (err) reject(err)
const params = {
ACL: 'public-read',
Bucket: config.aws_bucket,
ContentType: 'image/gif',
Key: `${prefix}/${uuid()}.gif`,
Body: buffer
}
try{
// uplaod to S3
const upload = await this.aws.upload(params)
// resolve s3 URL
resolve(upload)
}catch(err) {
console.log('err', err)
reject(err)
}
});
})
}
理想情况下,如果我可以将远程文件流作为自定义参数传递,或者将缓冲区作为自定义参数传递,而不是我当前在 tmp 文件路径中传递的方式:
images.forEach(image => {
this.gm.in(`tmp/${image.Key}`)
})