如何从firebase函数上传文件列表到firebase存储

时间:2017-10-26 08:16:21

标签: node.js firebase google-cloud-storage firebase-storage google-cloud-functions

我有一个firebase函数,它将从前端获取一个文件名称的请求,这将是存储在firebase存储中的视频,然后我将应用ffmpeg并将视频提取到许多帧。最后,我会将所有帧上传到firebase存储中。 一切都很好,我能够得到所有帧。但是,上传帧时存在问题。有时我可以成功上传所有帧,但该功能将一直运行直到超时,有时我只能上传第一帧。我是node.js的新手。我想返回或承诺存在问题(我不会放弃了解返回的内容以及如何处理承诺)。 另外,我想将每个帧的数据写入数据库。我应该把这部分代码放在哪里?

exports.extractFrame = functions.https.onRequest(function (req, res) {

const name = req.query.fileName;
const username = name.substr(0, name.length - 4);
const sessionId = 'video-org';
const framePath = 'frame-org';

const sourceBucketName = 'this is my bucket name';
const sourceBucket = gcs.bucket(sourceBucketName);
const temDir = os.tmpdir();

return sourceBucket.file(sessionId + '/' + name).download({
    destination: temDir + '/' + name
  }
).then(() => {
  console.log('extract frames');
  return spawn(ffmpegPath, ['-i', temDir + '/' + name, temDir + '/' + 
username + '%d.png']);
}).then(() => {
  const frames = fs.readdirSync(temDir);
  console.log(frames);

for (let index in frames) {
  if (index != 0) {
    console.log('uploading');
    sourceBucket.upload(temDir + '/' + frames[index], {destination: 
framePath + '/' + frames[index]});
  }
}
}).then(() => {
res.send('I am done');
});
});

非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:1)

将所有对sourceBucket.upload()的调用中的所有promise收集到一个数组中,然后使用Promise.all()在发送响应之前等待整个集合解析:

const promises = [];
for (let index in frames) {
  if (index != 0) {
    console.log('uploading');
    const p = sourceBucket.upload(temDir + '/' + frames[index], {destination: 
framePath + '/' + frames[index]});
    promises.push(p);
  }
}
return Promise.all(promises);

此外,您不会从HTTP类型函数返回承诺。只需使用res.send()发送回复即可结束此功能。这在documentation中提到。

答案 1 :(得分:0)

wrote a gist这一段时间了:

// set it up
firebase.storage().ref().constructor.prototype.putFiles = function(files) { 
  var ref = this;
  return Promise.all(files.map(function(file) {
    return ref.child(file.name).put(file);
  }));
}

// use it!
firebase.storage().ref().putFiles(files).then(function(metadatas) {
  // Get an array of file metadata
}).catch(function(error) {
  // If any task fails, handle this
});