Потоковая загрузка из S3 timeout - PullRequest
0 голосов
/ 14 февраля 2019

Я сталкиваюсь с некоторыми проблемами с тайм-аутом со службой промежуточного программного обеспечения (отныне файловая служба), разработанной с NestJS и AWS-S3.

Файловая служба имеет две основные цели:

  • Действует как уровень абстракции хранилища объектов, чтобы позволить бэкэнду загружать файлы в разные службы хранилища, полностью прозрачные для пользователя.
  • Получение подписанных токенов в качестве параметра URL-запроса с информацией о файле / объекте, проверка доступа к ресурсу и его потоковая передача.

Загрузка работает без проблем.

Загрузка небольших файловпроблем тоже нет.

Но когда я пытаюсь загрузить большие файлы (> 50 МБ), через несколько секунд соединение прерывается из-за истечения времени ожидания, и, как вы можете понять, загрузка не удалась.

I 'Несколько дней мы искали решения и читали документы.

Вот некоторые из них:

Но ничего не работает.

Здесь код:

Класс определения хранилища

export class S3Storage implements StorageInterface {
 config: any;

 private s3;

 constructor() {}

 async initialize(config: S3ConfigInterface): Promise<void> {
   this.config = config;
   this.s3 = new AWS.S3();

   // initialize S3 Configuration
   AWS.config.update({
     accessKeyId: config.accessKeyId,
     secretAccessKey: config.secretAccessKey,
     region: config.region
   });
 }

 async downloadFile(target: FileDto): Promise<Readable> {
   const params = {
     Bucket: this.config.Bucket,
     Key: target.sourcePath
   };

   return this.s3.getObject(params).createReadStream();
 }
}

Метод загрузки

private async downloadOne(target: FileDto, request, response) {
  const storage = await this.provider.getStorage(target.datasource);

  response.setHeader('Content-Type', mime.lookup(target.filename) ||    'application/octet-stream');
  response.setHeader('Content-Disposition',  `filename="${path.basename(target.filename)}";`);
  const stream = await storage.downloadFile(target);
  stream.pipe(response);

  // await download and exit
  await new Promise((resolve, reject) => {
    stream.on('end', () => {
      resolve(`${target.filename} has been downloaded`);
    });
    stream.on('error', () => {
      reject(`${target.filename} could not be downloaded`);
    });
  });
}

Если кто-то сталкивался с той же проблемой (или похожим), или у кого-то есть идеи (полезные или нет), я будупризнателен за любую помощь или совет.

Спасибо заранее.

...