Подписанные URL с ограничением длины контента - PullRequest
2 голосов
/ 18 октября 2019

У меня есть следующий код, который генерирует подписанный URL-адрес для загрузки файла:

const { Storage } = require('@google-cloud/storage');
const bucketName = 'foo-upload';
const storage = new Storage();
const uploadBucket = storage.bucket(bucketName);

exports.generateUploadLink = async (req, res) => {
  let contentId = req.query.contentId || req.body.contentId;

  let file = uploadBucket.file(`${contentId}.mp3`);

  try {
    let signedUrl = await file.getSignedUrl({
      action: 'write',
      expires: Date.now() + (30 * 1000),
      contentType: 'audio/mpeg'
    });
    res.status(200).json({meta: { status: 'OK'}, uploadUrl: signedUrl[0]});
  } catch(err) {
    console.log(`Error while getting signed url: ${err}`);
    res.status(500).json({meta: { status: 'FAIL', message: `Could not generate signed upload url for: ${contentId}`, error: err}});
  }
  return;
};

Как применить ограничение длины содержимого для подписанного URL-адреса, чтобы файл впоследствии передавался на URL-адрескоторый больше определенного количества байтов будет отклонен?

1 Ответ

1 голос
/ 18 октября 2019

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

Документ политики

Установить content-length-range.

Пример, который будетограничение загрузки от 0 до 1 000 000 000 байт и только для Content-Type image/jpeg.

{
 "expiration": "2020-06-16T11:11:11Z",
 "conditions": [
  ["starts-with", "$key", "" ],
  {"acl": "bucket-owner-read" },
  {"bucket": "example-bucket"},
  {"success_action_redirect": "http://www.example.com/success_notification.html" },
  ["eq", "$Content-Type", "image/jpeg" ],
  ["content-length-range", 0, 1000000000]
  ]
}
...