我目前正在使用node从远程文件创建GIF,通过将每个图像下载到文件系统中的tmp文件夹中。我希望绕过将图像保存到tmp文件夹中并改为在内存中保存。这种做法是否可行?正如您所看到的,我的AWS类中有一个下载函数,它将文件保存到tmp文件夹中。
理想情况下,如果我可以将远程文件流作为自定义参数传递,或者将缓冲区作为自定义参数传递,而不是使用当前的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
的自定义参数添加,延迟50ms,调整大小,然后输出为缓冲区,最后上传至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}`)
})