NodeJS скачать файл с AWS S3 Bucket - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь создать конечную точку в NodeJS / Express для загрузки контента из моего AWS S3 Bucket.

Это хорошо работает, я могу загрузить файл на стороне клиента, но я также вижу предварительный просмотр потока на вкладке Сеть, которая раздражает ...

ВОПРОС

Мне интересно, правильно ли я делаю то, что делаю. Также хотелось бы узнать, нормально ли видеть выходной поток на вкладке Сеть.

Как правильно отправить файл из S3 в мое клиентское приложение с помощью NodeJS / Express?

Я уверен, что запросы других веб-сайтов не позволяют просматривать содержимое с помощью: " Не удалось загрузить данные ответа ".


Это то, что я делаю в своем приложении NodeJS, чтобы получить потоковый файл из AWS S3:

download(fileId) {
  const fileObjectStream = app.s3
    .getObject({
      Key: fileId
    })
    .createReadStream();
  this.res.set("Content-Type", "application/octet-stream");
  this.res.set(
    "Content-Disposition",
    'attachment; filename="' + fileId + '"'
  );
  fileObjectStream.pipe(this.res);
}

И на стороне клиента я вижу это:

enter image description here

1 Ответ

0 голосов
/ 11 июля 2019

Я думаю, что проблема связана с заголовком:

          //this line will set proper header for file and make it downloadable in client's browser

          res.attachment(key); 

          // this will execute download 
          s3.getObject(bucketParams)
          .createReadStream()
          .pipe(res);

Так что код должен быть таким (Это то, что я делаю в файле обработки моего проекта как res.attachment или res.json на случай, еслиошибки, чтобы клиент мог отобразить ошибку для конечного пользователя):

router.route("/downloadFile").get((req, res) => {
      const query = req.query; //param from client
      const key = query.key;//param from client
      const bucketName = query.bucket//param from client

      var bucketParams = {
        Bucket: bucketName,  
        Key: key
      };

      //I assume you are using AWS SDK
      s3 = new AWS.S3({ apiVersion: "2006-03-01" });

      s3.getObject(bucketParams, function(err, data) {
        if (err) {
          // cannot get file, err = AWS error response, 
          // return json to client
          return res.json({
            success: false,
            error: err
          });
        } else {
          res.attachment(key); //sets correct header (fixes your issue ) 
          //if all is fine, bucket and file exist, it will return file to client
          s3.getObject(bucketParams)
            .createReadStream()
            .pipe(res);
        }
      });
    });
...