import { S3 } from 'aws-sdk'; import { Logger, Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; //https://github.com/dimer47/node-ovh-objectstorage#readme // based on https://docs.openstack.org/api-ref/object-store import OVHStorage from 'node-ovh-objectstorage'; //second solution : https://github.com/stefanodefaria/swift-client //import SwiftClient from 'openstack-swift-client'; //therd solution use directly the api of /** TODO update with multer s3 : after check the lib stability */ @Injectable() export class FileUploadService { bucketName: string; s3Instance: S3 = null; swiftInstance: OVHStorage = null; constructor( private configService: ConfigService ) { this.bucketName = this.configService.get('AWS_S3_BUCKET'); this.s3Instance = this.getS3(); this.swiftInstance = this.getSwift(); //this.swiftconnet(); } async swiftconnet() { try { //let storage = new OVHStorage(config); await this.getSwift().connection(); } catch (e) { // throw e console.log('error swift connection', e); } } /** Singleton istance for the s3 object */ getSwift(): OVHStorage { //console.log('getSwift ', this.swiftInstance); if (this.swiftInstance) return this.swiftInstance; const storageConfig = { username: this.configService.get('SWIFT_USER_NAME'), password: this.configService.get('SWIFT_PASSWORD'), authURL: this.configService.get('SWIFT_AUTH_END_POINT'), tenantId: this.configService.get('SWIFT_TENENT_ID'), region: this.configService.get('SWIFT_REGION') // key is optional // key: "Temporary key (optional), for generate temporary download link", // // options is optional // options: { // slugify : true, // true, by default // check_exists: true, // true, by default // } } //console.log('swift storageConfig', storageConfig); return new OVHStorage(storageConfig); } async upload(file: Express.Multer.File, isS3: boolean = false) { if (isS3) { return await this.uploadS3(file.buffer, this.bucketName, file.originalname); } else { await this.swiftconnet(); return await this.uploadSwift(file); } } async uploadSwift(file: Express.Multer.File) { try { const path: string = this.configService.get('SWIFT_CONTAINER')+ file.originalname; const publicPath : string = this.configService.get('SWIFT_PUBLIC_URL')+ file.originalname; //console.log('uploadSwift path', path); const res = await this.getSwift().objects().saveData(file.buffer, path); return { ...res, publicPath : publicPath}; } catch (e) { console.log('upload swift error', e); } } /** Singleton istance for the s3 object */ getS3() { if (this.s3Instance) return this.s3Instance; return new S3({ endpoint: this.configService.get('AWS_S3_END_POINT'), accessKeyId: this.configService.get('AWS_ACCESS_KEY_ID'), secretAccessKey: this.configService.get('AWS_SECRET_ACCESS_KEY') }); } async uploadS3(file, bucket, name) { const params = { Bucket: bucket, Key: String(name), Body: file, }; return new Promise((resolve, reject) => { this.getS3().upload(params, (err, data) => { if (err) { Logger.error(err); reject(err.message); } console.log('data upload s3', data); resolve(data); }); }); } /** get file from s3 bucket */ async getObjectS3(fileKey: string) { console.log('fileKey', fileKey); return new Promise((resolve, reject) => { this.getS3().getObject( { Bucket: this.bucketName, Key: fileKey }, function (err, data) { if (err) { console.error('s3 get file (object) error ', err); Logger.error(err); reject(err.message); } else { console.log('s3 get file (object) data sucess', data); resolve(data); } } ); }); } /** get stream file from s3 bucket */ async getstreamObjectS3(fileKey: string) { //https://stackoverflow.com/questions/69718485/how-to-download-file-from-aws-s3-bucket-in-nestjs // res.attachment(fileKey); // var fileStream = s3.getObject(options).createReadStream(); // fileStream.pipe(res); // // Download to specific location with following code: // var file = require('fs').createWriteStream('your/download/path'); // s3.getObject(params).createReadStream().pipe(file); // return new Promise((resolve, reject) => { // this.getS3().getObject( // { Bucket: this.bucketName, Key: fileKey }, // function (err, data) { // if (err) { // console.error('s3 get file (object) error ', err); // Logger.error(err); // reject(err.message); // } else { // console.log('s3 get file (object) data sucess', data); // resolve(data); // } // } // ); // }); } }