файл res.download с S3 - PullRequest
       4

файл res.download с S3

0 голосов
/ 13 февраля 2020

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

Файл изначально был загружен в Amazon S3, и я получил к нему доступ с помощью функции getObject.

Вот мой код:

app.get('/test_script_api', function(req, res){
    var fileName = req.query.File;
    s3.getObject(
        { Bucket: "bucket-name", Key: fileName },
        function(error, s3data){
            if(error != null){
                console.log("Failed to retrieve an object: " + error);
            }else{
                //I have tried passing the S3 data but it asks for a string
                res.download(s3data.Body);

                //So I have tried just passing the file name & an absolute path
                res.download(fileName);
            }
        }
    );
});

Это возвращает следующую ошибку: Ошибка: ENOENT: нет такого файла или каталога, stat '/home/ec2-user/environment/test2.txt'

Когда я введите абсолютный путь, он просто добавляет его в конец / home / ec2-user / environment /

Как мне изменить каталог, из которого пытается скачать res.download?

Есть ли более простой способ загрузить ваши файлы с Amazon S3?

Любая помощь будет высоко ценится здесь!

1 Ответ

1 голос
/ 07 мая 2020

У меня была такая же проблема, и я нашел ответ: NodeJS Как загрузить файл на диск из aws s3 корзины?

Исходя из этого, вы нужно использовать createReadStream () и pipe (). R здесь больше о stream.pipe () - https://nodejs.org/en/knowledge/advanced/streams/how-to-use-stream-pipe/

res.attachment () установит заголовки для вас. -> https://expressjs.com/en/api.html#res .attachment .

Этот код должен работать для вас (основываясь на ответе по ссылке выше):

app.get('/test_script_api', function (req, res) {
  var fileName = req.query.File;
  res.attachment(fileName);
  var file = s3.getObject({
    Bucket: "bucket-name",
    Key: fileName
    }).createReadStream()
      .on("error", error => {
      });
   file.pipe(res);
});

В моем случае, на клиентской стороне я использовал <a href="URL to my route" download="file name"></a> Это позволило убедиться, что файл загружается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...