Я сталкиваюсь с некоторыми проблемами с тайм-аутом со службой промежуточного программного обеспечения (отныне файловая служба), разработанной с 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`);
});
});
}
Если кто-то сталкивался с той же проблемой (или похожим), или у кого-то есть идеи (полезные или нет), я будупризнателен за любую помощь или совет.
Спасибо заранее.