Отправка нескольких файлов в Google Bucket с Multer - почему мои файлы пусты? - PullRequest
0 голосов
/ 01 марта 2019

У меня ранее была настроена и работала загрузка одного файла.Теперь мне нужно, чтобы он обрабатывал несколько файлов.

Вот мой код прямо сейчас:

const multer = require('multer')
const { Storage } = require('@google-cloud/storage')

const storage = new Storage()

const m = multer({ storage: multer.memoryStorage()  })

module.exports = app => {
  app.use('/', router)
  router.post(
    '/reader-:shortId/file-upload',
    passport.authenticate('jwt', { session: false }),
    m.array('files'),
    async function (req, res) {
      const bucketName = req.params.shortId.toLowerCase()
      await storage.createBucket(bucketName)
      bucket = storage.bucket(bucketName)
      let promises = []

      req.files.forEach((file) => {
        const blob = bucket.file(file.originalname)
        const newPromise =  new Promise((resolve, reject) => {
          blob.createWriteStream({
            metadata: { contentType: file.mimetype }
          }).on('finish', async response => {
            await blob.makePublic()
            resolve(response)
          }).on('error', err => {
            reject('upload error: ', err)
          }).end()
        })
       promises.push(newPromise)
     })

     Promise.all(promises).then((response) => {
       // the response I get here is [undefined, undefined]
       res.status(200).send(response)
     }).catch((err) => {
       res.status(400).send(err.message)
     });
    })
  }

req.files дает мне массив файлов с буфером и размером, который имеет смысл.Обещания все решают.Но как только я проверяю файлы в Google Bucket, они имеют правильное имя, но не имеют никакого содержимого (и размер 0)

Как я уже говорил, это работало, когда я делал это с однимфайл (используя m.single ('file')

Я не хочу использовать корзину в качестве места назначения с настройкой мультитера, потому что мне также нужно изменить имя файла перед загрузкой в ​​корзину Google.

edit: это пример кода, предоставленный облачной документацией Google для загрузки отдельных файлов (https://cloud.google.com/nodejs/getting-started/using-cloud-storage):

function sendUploadToGCS (req, res, next) {
  if (!req.file) {
    return next();
  }

  const gcsname = Date.now() + req.file.originalname;
  const file = bucket.file(gcsname);

  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    },
    resumable: false
  });

  stream.on('error', (err) => {
    req.file.cloudStorageError = err;
    next(err);
  });

  stream.on('finish', () => {
    req.file.cloudStorageObject = gcsname;
    file.makePublic().then(() => {
      req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
      next();
    });
  });

  stream.end(req.file.buffer);
}

У меня изначально было что-то подобное, но я просто не понимаюоткуда он получает данные файлового буфера. Вероятно, там, где разные файлы различны.

1 Ответ

0 голосов
/ 02 марта 2019

Хорошо, оказывается, мне пришлось изменить .end() на .end(file.buffer)

...