繁体   English   中英

将多个文件发送到Node中的GCS

[英]Sending multiple files to GCS in Node

因此,我需要更改Google Cloud Storage中的此功能,以便它可以上传多个文件,而不是一个。 我正在尝试找到一个好的解决方案,使其始终等到所有文件上传完毕。 不知道如何使其异步-我应该在stream.on('finish',(...))还是file.makePublic().then(...)file.makePublic().then(...)这绝对是我可以收集的Promiste与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

这是我如何解决的:

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())
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM