从S3超时流下载

时间:2019-02-14 16:36:51

标签: amazon-web-services amazon-s3 connection-timeout nestjs

我使用NestJS和AWS-S3开发的“中间件”(从现在开始是文件服务)服务面临一些超时问题。

文件服务有两个主要目的:

  • 充当对象存储抽象层,以允许后端将文件上传到对用户完全透明的其他存储服务。
  • 将签名的令牌作为带有文件/对象信息的url查询参数接收,验证对资源的访问并将其流式传输。

上传正常进行。

下载小文件也没有问题。

但是当我尝试下载大文件(> 50MB)时,几秒钟后,由于超时,连接断开,您可以确定下载失败。

我已经花了几天时间寻找解决方案并阅读文档。

其中一些:

但没有任何效果。

代码在这里:

存储定义类

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`);
    });
  });
}

如果任何人遇到相同的问题(或相似的问题)或任何想法(有用或没有用),我将不胜感激。

谢谢。

0 个答案:

没有答案