Передача файла прямо клиенту с использованием Node.js и Amazon S3 - PullRequest
0 голосов
/ 24 ноября 2018

Итак, я хочу передать файл прямо клиенту;в настоящее время я создаю файл на диск, а затем отправляю его прямо клиенту.

router.get("/download/:name", async (req, res) => {

  const s3 = new aws.S3();
  const dir = "uploads/" + req.params.name + ".apkg"
  let file = fs.createWriteStream(dir);

  await s3.getObject({
    Bucket: <bucket-name>,
    Key: req.params.name + ".apkg"
  }).createReadStream().pipe(file);

  await res.download(dir);
});

Я только что посмотрел, что res.download() работает только локально.Есть ли способ сделать это напрямую из AWS S3 в клиентскую загрузку?то есть передаются файлы напрямую пользователю.Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

S3 можно использовать для содержимого, поэтому я бы сделал следующее:

  1. Добавьте заголовки CORS в ответе вашего узла.Это позволит браузеру загружать из другого источника, то есть S3.
  2. Включите веб-сервер S3 в вашем хранилище.
  3. Скрипт для загрузки перенаправления с S3 - этого можно достичь в JS.

Используйте подписанный URL, как предложено вдругой пост, если вам нужно защитить содержимое S3.

0 голосов
/ 16 декабря 2018

Как описано в этом SO-потоке :
Вы можете просто направить поток чтения в ответ вместо того, чтобы передать его в файл, просто убедитесь, что введены правильные Content-Type иустановите его как вложение, чтобы браузер знал, как правильно обрабатывать ответ.

res.attachment(req.params.name);
await s3.getObject({
    Bucket: <bucket-name>,
    Key: req.params.name + ".apkg"
}).createReadStream().pipe(res);

Более подробно об этом можно создать подписанный URL-адрес непосредственно для объекта S3, а затем позволить клиенту загружать файлы напрямую.с S3 вместо потоковой передачи с вашего веб-сервера узла.Это уменьшит нагрузку на ваш веб-сервер.

Вам нужно будет использовать метод getSignedUrl из AWS S3 SDK для JS.
Затем, получив URL-адрес, простоверните его своему клиенту, чтобы загрузить файл самостоятельно.

Вам следует принять во внимание, что как только вы дадите клиенту подписанный URL-адрес, который имеет разрешения на загрузку, скажем, на 5 минут, он сможет загружать этот файл только в течение следующих 5 минут.И вам также следует принять во внимание, что они смогут передать этот URL кому-либо еще для загрузки в течение этих 5 минут, так что это зависит от того, насколько вам это нужно.

...