google-cloud-functionsresize-imagefirebase-extensions

Resize all existing images stored in firebase storage and update the newly resized image url to database via api call


I have requirement to resize new and existing images stored in firebase store. For new image, I enabled firebase's resize image extension. For existing image, how can I resized the image and get the newly resized image url to update back to database via api.

Here is my firebase function to get existing image urls from database. My question is how to resize the image and get the new image url?

const functions = require("firebase-functions"); const axios =require("axios");

async function getAlbums() {

const endpoint = "https://api.mydomain.com/graphql";
const headers = {
  "content-type": "application/json",
};

const graphqlQuery = {
  "query": `query Albums {
    albums {
      id
      album_cover
    }
  }`
};
functions.logger.info("Call API");
const response = await axios({
  url: endpoint,
  method: 'post',
  headers: headers,
  data: graphqlQuery
});

if(response.errors) {
    functions.logger.info("API ERROR : ", response.errors) // errors if any
} else {
    return response.data.data.albums;
}
}

exports.manualGenerateResizedImage = functions.https.onRequest(async () => {
    const albums = await getAlbums();
    functions.logger.info("No. of Album : ", albums.length);
});

Solution

  • I think the below answer from Renaud Tarnec will definitely help you.

    If you look at the code of the "Resize Images" extension, you will see that the Cloud Function that underlies the extension is triggered by a onFinalize event, which means:

    When a new object (or a new generation of an existing object) is successfully created in the bucket. This includes copying or rewriting an existing object.

    So, without rewriting/regenerating the existing images the Extension will not be triggered.

    However, you could easily write your own Cloud Function that does the same thing but is triggered, for example, by a call to a specific URL (HTTPS cloud Function) or by creating a new document in a temporary Firestore Collection (background triggered CF).

    This Cloud Function would execute the following steps:

    1. Get all the files of your bucket, see the getFiles() method of the Google Cloud Storage Node.js Client API. This method returns a GetFilesResponse object which is an Array of File instances.
    2. By looping over the array, for each file, check if the file has a corresponding resized image in the bucket (depending on the way you configured the Extension, the resized images may be in a specific folder)
    3. If a file does not have a corresponding resized image, execute the same business logic of the Extension Cloud Function for this File.

    There is an official Cloud Function sample which shows how to create a Cloud Storage triggered Firebase Function that will create resized thumbnails from uploaded images and upload them to the database URL, (see the last lines of index.js file)

    Note : If you have a lot of files to treat, you should most probably work by batch, since there is a limit of 9 minutes for Cloud Function execution. Also, depending on the number of images to treat, you may need to increase the timeout value and/or the allocated memory of your Cloud Function, see https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation