【问题标题】:Sending multiple files to GCS in Node在 Node 中将多个文件发送到 GCS
【发布时间】:2019-09-02 15:32:21
【问题描述】:

所以我从 Google Cloud Storage 获得了这个功能,我需要对其进行更改,以便它可以上传多个文件而不是一个文件。我正在尝试找到一个好的解决方案,让它始终等到所有文件都上传完毕。不知道如何使它异步 - 我应该在 stream.on('finish',(...))file.makePublic().then(...) 上等待,这绝对是我可以用 Promise.all() 收集然后解析 next() 的承诺。

或者如果 Google 没有在他们的文档中披露的解决方案已经存在,那就更好了。

功能:

function sendUploadsToGCS (req, res, next) {
  if (!req.files) {
    return next()
  }

  let vals = Object.values(req.files)

  for(let f of vals){
    const gcsname = Date.now() + f[0].originalname
    const file = bucket.file(gcsname)

    const stream = file.createWriteStream({
      metadata: {
        contentType: f[0].mimetype
      },
      resumable: false
    })

    stream.on('error', (err) => {
      f[0].cloudStorageError = err
      next(err)
    })

    stream.on('finish', () => {
      f[0].cloudStorageObject = gcsname;
      file.makePublic().then(() => {
        f[0].cloudStoragePublicUrl = getPublicUrl(gcsname)
        console.log('pub url: ', getPublicUrl(gcsname))
        next()
      })
    })

    stream.end(f[0].buffer)
  }
}

原始函数(一个文件):https://cloud.google.com/nodejs/getting-started/using-cloud-storage#upload_to_cloud_storage

【问题讨论】:

  • 这是一个类似问题的 [链接][1],其中包含并行上传文件的有效答案 [1]:stackoverflow.com/questions/54095155/…
  • 谢谢@AndieVega!我使用了类似的东西,但我喜欢其他答案在 Promise.all() 中使用地图的方式

标签: node.js google-cloud-storage


【解决方案1】:

我是这样解决的:

function sendUploadsToGCS (req, res, next) {
  if (!req.files) {
    return next()
  }

  let promises = []
  let vals = Object.values(req.files)

  for(let f of vals){
    const gcsname = Date.now() + f[0].originalname
    const file = bucket.file(gcsname)

    const stream = file.createWriteStream({
      metadata: {
        contentType: f[0].mimetype
      },
      resumable: false
    })

    stream.on('error', (err) => {
      f[0].cloudStorageError = err
      next(err)
    })

    stream.end(f[0].buffer)

    promises.push(
      new Promise ((resolve, reject) => {
        stream.on('finish', () => {
          f[0].cloudStorageObject = gcsname;
          file.makePublic().then(() => {
            f[0].cloudStoragePublicUrl = getPublicUrl(gcsname)
            resolve()
          })
        })
      })
    )
  }
  Promise.all(promises).then(() => next())
}

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 2017-10-30
    • 2014-04-06
    • 1970-01-01
    • 2022-11-12
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多