compressedthumbnail update

This commit is contained in:
Shams mosowi
2021-02-05 13:40:55 +08:00
parent 4cdae5eb5e
commit bef47a93d2

View File

@@ -2,18 +2,14 @@ import * as functions from "firebase-functions";
// tslint:disable-next-line: no-import-side-effect
import "../config";
import * as admin from "firebase-admin";
import * as path from "path";
import * as os from "os";
import * as fs from "fs";
import * as sharp from "sharp";
import * as imagemin from "imagemin";
import * as imageminMozjpeg from "imagemin-mozjpeg";
import imageminPngquant from "imagemin-pngquant";
import config_ from "../functionConfig";
const SUPPORTED_TYPES = ["image/jpeg", "image/png"];
const DEFAULT_SIZES = ["400x400", "200x200", "100x100"];
const config: any = config_;
@@ -27,29 +23,25 @@ const excludePaths =
typeof config.excludes[0] === "string"
? config.excludes
: [];
export const FT_compressedThumbnail = functions.storage
.object()
.onFinalize(async (object) => {
// Log file name, size, and content type for monitoring
console.log(object.name, object.size, object.contentType);
// Exit if this is triggered on a file that is not an image.
if (!object.contentType || !SUPPORTED_TYPES.includes(object.contentType)) {
console.log("Unsupported type", object.contentType);
return null;
}
// Exit if this is already a compressed thumbnail.
if (object.metadata?.resizedImage) {
console.log("This is already a compressed thumbnail", object.name);
return null;
}
// Get Firebase Storage download token
const token = object.metadata?.firebaseStorageDownloadTokens;
const filePath = object.name!;
const filePath: string = object.name!;
// Check if file should be excluded based off path
for (const excludePath of excludePaths)
@@ -57,17 +49,14 @@ export const FT_compressedThumbnail = functions.storage
console.log("File excluded from path", excludePath);
return null;
}
const baseFileName = path.basename(filePath, path.extname(filePath));
const tempLocalFile = path.join(
os.tmpdir(),
baseFileName + path.extname(filePath)
);
// Download file from bucket.
const bucket = admin.storage().bucket(object.bucket);
await bucket.file(filePath).download({ destination: tempLocalFile });
for (const size of sizes) {
try {
const thumbFilePath = path.normalize(
@@ -81,9 +70,9 @@ export const FT_compressedThumbnail = functions.storage
os.tmpdir(),
path.basename(thumbFilePath)
);
// Resize image to thumbnail size
const resized = await sharp(tempLocalFile)
.rotate()
.resize(
parseInt(size.split("x")[0], 10),
parseInt(size.split("x")[1], 10),
@@ -93,7 +82,6 @@ export const FT_compressedThumbnail = functions.storage
}
)
.toBuffer();
// Compress the image
const compressed = await imagemin.buffer(resized, {
plugins: [
@@ -102,7 +90,6 @@ export const FT_compressedThumbnail = functions.storage
],
});
fs.writeFileSync(tempLocalThumbFile, compressed);
// Upload the image
await bucket.upload(tempLocalThumbFile, {
destination: thumbFilePath,
@@ -115,15 +102,12 @@ export const FT_compressedThumbnail = functions.storage
},
});
console.log(size, "thumbnail uploaded to Storage at", thumbFilePath);
// Once the image has been converted delete the local files to free up disk space.
fs.unlinkSync(tempLocalThumbFile);
} catch (e) {
console.error(`Failed to generate thumbnail size: ${size}`, e);
}
}
fs.unlinkSync(tempLocalFile);
return filePath;
});