multer-s3-sharp-resizer
Version:
storage engine for multer to upload multiple images of different sizes to s3 object storage
93 lines • 3.85 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = __importDefault(require("path"));
const service_getDefaultFilenameBase_1 = __importDefault(require("../services/service.getDefaultFilenameBase"));
const service_uploadFromStream_1 = __importDefault(require("../services/service.uploadFromStream"));
const service_convertImage_1 = __importDefault(require("../services/service.convertImage"));
const service_removeFileExtension_1 = __importDefault(require("../services/service.removeFileExtension"));
class MulterS3SharpStorage {
constructor(input) {
this.uploadOriginalImage = true;
this.metadata = () => { return {}; };
this.imageFormats = input.imageFormats || [];
this.uploadOriginalImage = input.uploadOriginalImage !== undefined ? input.uploadOriginalImage : true;
this.keyBase = input.keyBase || service_getDefaultFilenameBase_1.default;
this.s3 = input.s3;
this.bucket = input.bucket;
this.metadata = input.metadata || this.metadata;
}
async _handleFile(req, file, cb) {
const originalImage = file.stream;
const pipes = [];
const uploadResults = [];
const baseKey = this.keyBase(req, file);
if (this.uploadOriginalImage) {
const originalImageUpload = await (0, service_uploadFromStream_1.default)(req, {
s3: this.s3,
bucket: this.bucket,
file,
key: `${baseKey}${path_1.default.extname(file.originalname)}`
}, this.keyBase, this.metadata);
uploadResults.push(originalImageUpload);
pipes.push(originalImage.pipe(originalImageUpload.stream));
}
for (const imageSettings of this.imageFormats) {
const resizeImageUpload = await (0, service_uploadFromStream_1.default)(req, {
key: `${imageSettings.folder + '/' || ''}${baseKey}.${imageSettings.fileFormat}`,
file,
s3: this.s3,
bucket: this.bucket
}, this.keyBase, this.metadata);
uploadResults.push(resizeImageUpload);
pipes.push(originalImage
.pipe((0, service_convertImage_1.default)(imageSettings))
.pipe(resizeImageUpload.stream));
}
const uploadedFiles = await Promise.all(uploadResults.map(ur => ur.upload));
cb(null, {
uploadedFiles,
key: baseKey
});
}
async removeKey(key) {
const deleteFiles = [];
const returnedResult = [];
if (this.uploadOriginalImage) {
const deletion = this.s3.deleteObject({
Bucket: this.bucket,
Key: key
}).promise();
deleteFiles.push(deletion);
await deletion;
returnedResult.push({
filename: key
});
}
for (const format of this.imageFormats) {
const deletion = this.s3.deleteObject({
Bucket: this.bucket,
Key: `${format.folder + '/' || ''}${(0, service_removeFileExtension_1.default)(key)}.${format.fileFormat}`
}).promise();
deleteFiles.push(deletion);
await deletion;
returnedResult.push({
filename: key,
folder: format.folder
});
}
try {
await Promise.all(deleteFiles);
return returnedResult;
}
catch (err) {
throw err;
}
}
_removeFile(req, file, cb) {
}
}
exports.default = MulterS3SharpStorage;
//# sourceMappingURL=class.MulterS3SharpStorage.js.map