Search code examples
javascriptfirebasegoogle-cloud-platformgoogle-cloud-functionsfirebase-storage

How to get public download link within a firebase storage trigger function: "onFinalize"?


I am writing a firebase cloud function that records the download link of a recentally uploaded file to real-time database:

exports.recordImage = functions.storage.object().onFinalize((object) => {

});

"object" gives me access to two variables "selfLink" and "mediaLink" but both of them when entered in a browser they return the following:

Anonymous caller does not have storage.objects.get access to ... {filename}

So, they are not public links. How can I get the public download link within this trigger function?


Solution

  • You have to use the asynchronous getSignedUrl() method, see the doc of the Cloud Storage Node.js library: https://cloud.google.com/nodejs/docs/reference/storage/2.0.x/File#getSignedUrl.

    So the following code should do the trick:

    .....
    const defaultStorage = admin.storage();
    .....
    
    exports.recordImage = functions.storage.object().onFinalize(object => {    
      const bucket = defaultStorage.bucket();
      const file = bucket.file(object.name);
    
      const options = {
        action: 'read',
        expires: '03-17-2025'
      };
    
      // Get a signed URL for the file
      return file
        .getSignedUrl(options)
        .then(results => {
          const url = results[0];
    
          console.log(`The signed url for ${filename} is ${url}.`);
          return true;
        })
    
    });
    

    Note that, in order to use the getSignedUrl() method, you need to initialize the Admin SDK with the credentials for a dedicated service account, see this SO Question & Answer firebase function get download url after successfully save image to firebase cloud storage.