使用 For 循环将多个文件上传到 Google Cloud Storage

萨坎

我正在尝试将多个文件上传到 Google Cloud Storage。我正在为要上传的文件列表中的每个文件使用 for 循环。

但是,问题在于 for 循环在继续下一次上传之前不会暂停以等待上传完成。它最终上传它们,但是,for 循环提前完成,然后将空的urlList.

在继续执行 for 循环中的下一个文件之前,如何让它暂停并等待每个上传过程?

const processFile = require('../middleware');
const { format } = require('util');
let uuidv4 = require('uuid/v4');

const Cloud = require('@google-cloud/storage');

const { Storage } = Cloud;
const storage = new Storage({
  keyFilename: './xxx.json',
  projectId: 'xxx'
});

const bucket = storage.bucket('xxx');

exports.upload = async (req, res) => {
  const urlList = [];
  await processFile(req, res); //multer

  for (var i = 0; i < req.files.length; i++) {

    if (!req.files[i]) {
      return res.status(400).send({ message: 'Please upload a file!' });
    }

    const { originalname, buffer } = req.files[i];
    var filename = originalname
      .toLowerCase()
      .split(' ')
      .join('-');

    filename = uuidv4() + '-' + filename;

    console.log(filename);

    const blob = bucket.file(filename);

    const blobStream = blob.createWriteStream({
      resumable: false
    });

    blobStream.on('error', err => {
      res.status(500).send({ message: err.message });
    });

    blobStream.on('finish', async data => {
      const publicUrl = format(
        `https://storage.googleapis.com/${bucket.name}/${blob.name}`
      );
      urlList.push(publicUrl);

      try {
        await bucket.file(filename).makePublic();
      } catch (err) {
        console.log('failed to make it public');
        reject(err);
      }
    });

    blobStream.end(buffer);
  }

  return res.status(200).send({
    message: 'Uploaded the files successfully',
    url: urlList
  });
};
塔里克·胡贝尔

只要把你的“上传”代码的Promise,你可以await在回路中。否则通过使用on其中的代码将不会遵循 for 循环。通过使用这种基于事件的代码,您的 for 循环将通过它而不能等待它完成。这应该可以解决问题:

const uploadFile = (f) => {
  return new Promise((resolve, reject) => {
    const { originalname, buffer } = f;
    var filename = originalname.toLowerCase().split(" ").join("-");

    filename = uuidv4() + "-" + filename;

    console.log(filename);

    const blob = bucket.file(filename);

    const blobStream = blob.createWriteStream({
      resumable: false,
    });

    blobStream.on("error", (err) => {
      res.status(500).send({ message: err.message });
      reject(err);
    });

    blobStream.on("finish", async (data) => {
      const publicUrl = format(
        `https://storage.googleapis.com/${bucket.name}/${blob.name}`
      );

      try {
        await bucket.file(filename).makePublic();
        resolve(publicUrl);
      } catch (err) {
        console.log("failed to make it public");
        reject(err);
      }
    });

    blobStream.end(buffer);
  });
};

exports.upload = async (req, res) => {
  const urlList = [];
  await processFile(req, res); //multer

  for (var i = 0; i < req.files.length; i++) {
    if (!req.files[i]) {
      return res.status(400).send({ message: "Please upload a file!" });
    }

    const publicUrl = await uploadFile(req.files[i]);
    urlList.push(publicUrl);
  }

  return res.status(200).send({
    message: "Uploaded the files successfully",
    url: urlList,
  });
};


本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Flask将文件上传到Google Cloud Storage

使用 Codeigniter 将文件上传到 Google Cloud Storage

使用Google App Engine(Python)将文件上传到Google Cloud Storage

使用Google App Engine将大文件上传到Google Cloud Storage

如何使用Java API在一个调用中将多个文件上传到Google Cloud Storage?

使用JSON API将文件上传到Google Cloud Storage,错误401未经授权

使用PHP和Ajax将文件上传到Google Cloud Storage Bucket

如何使用JSON API和CloseableHttpClient将文件上传到Google Cloud Storage存储桶?

使用 Node.js 将文件上传到 Google Cloud Storage(已声明“bucketName”)

使用Python将文件上传到Google Cloud Storage签名的URL

使用Python将文件上传到Google Cloud Storage Bucket子目录

使用C#中的HMAC密钥将文件上传到Google Cloud Storage

将 xml 文件上传到 Google Cloud Storage 时出错

Alamofire无法将文件上传到Google Cloud Storage

将文件上传到Google Cloud Storage:500后端错误

将.raw文件上传到Google Cloud Storage

使用Java通过Google App Engine将文件上传到Google Cloud Storage :(无此类文件或目录)

如何通过Cloud Functions将文件上传到Cloud Storage并使用Firestore控制对Cloud Storage的访问?

将多个 Pandas 数据框作为包含多个工作表的单个 Excel 文件上传到 Google Cloud Storage

将图像从Google Cloud Function上传到Cloud Storage

使用 GAE 和 Google Cloud Storage 从 csv 文件上传到存储桶图片

使用Node JS将图像从本地目录上传到Google Cloud Storage

使用 Dot Net Core MVC 将视频上传到 Google Cloud Storage

使用NodeJS在本地将文件上传到Google Cloud存储

使用Python 3问题将文件上传到Google Cloud

使用Google Cloud Dataflow合并Google Cloud Storage中的文件

将文件上传到Google Cloud Storage而不在本地下载文件?

自动将数据上传到 Google Cloud Storage 和 BigQuery

将 Excel 上传到 Google Cloud Storage 时出错