Как правильно установить заголовки ответа при потоковой загрузке изображения из Google Cloud Storage - PullRequest
0 голосов
/ 09 июня 2019

Пока у меня есть это:

app.get('/:image/:size.:ext', (req, res) => {
  const remote = bucket.file(`${req.params.image}/${req.params.size}.${req.params.ext}`)
  if (req.query.download == 'true') {
    res.set('Content-Type', 'image/jpg')
    res.set('Content-Disposition', `attachment; filename="${req.params.image}.${req.params.size}.${req.params.ext}";` )
    res.set('Content-Transfer-Encoding', 'binary')
    // header("Content-Length: ".filesize($filename))
  }
  // if (isProd)
  //   res.set('Cache-Control', 'public, max-age=604800')
  remote.createReadStream({ validation: false })
    .on('error', error => {
      console.log(error)
      res.send(`data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7`)
    })
    .pipe(res)
})

В этом блоке download=true я не уверен, как получить размер файла, если он каким-то образом передается через поток remote, или если яследует хранить это в базе данных где-то, иначе получить можно как-то.

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете получить metadata.size от getMetadata (параметры, обратный вызов) , который возвращает Promise, содержащий GetFileMetadataResponse

storage
  .bucket(bucketName)
  .file(filename)
  .getMetadata()
  .then(results => {
    const metadata = results[0];

    console.log(`File: ${metadata.name}`);
    console.log(`Size: ${metadata.size}`);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });
...