Get Download URL from file uploaded with Cloud Functions for Firebase

后端 未结 23 1804
春和景丽
春和景丽 2020-11-22 01:19

After uploading a file in Firebase Storage with Functions for Firebase, I\'d like to get the download url of the file.

I have this :

...

return buck         


        
相关标签:
23条回答
  • 2020-11-22 01:59

    I had the same issue, however, I was looking at the code of the firebase function example instead of the README. And Answers on this thread didn't help either...

    You can avoid passing the config file by doing the following:

    Go to your project's Cloud Console > IAM & admin > IAM, Find the App Engine default service account and add the Service Account Token Creator role to that member. This will allow your app to create signed public URLs to the images.

    source: Automatically Generate Thumbnails function README

    Your role for app engine should look like this:

    0 讨论(0)
  • 2020-11-22 02:00

    I already post my ans... in below URL Where you can get full code with solution

    How do I upload a base64 encoded image (string) directly to a Google Cloud Storage bucket using Node.js?

    const uuidv4 = require('uuid/v4');
    const uuid = uuidv4();
    
        const os = require('os')
        const path = require('path')
        const cors = require('cors')({ origin: true })
        const Busboy = require('busboy')
        const fs = require('fs')
        var admin = require("firebase-admin");
    
    
        var serviceAccount = {
            "type": "service_account",
            "project_id": "xxxxxx",
            "private_key_id": "xxxxxx",
            "private_key": "-----BEGIN PRIVATE KEY-----\jr5x+4AvctKLonBafg\nElTg3Cj7pAEbUfIO9I44zZ8=\n-----END PRIVATE KEY-----\n",
            "client_email": "xxxx@xxxx.iam.gserviceaccount.com",
            "client_id": "xxxxxxxx",
            "auth_uri": "https://accounts.google.com/o/oauth2/auth",
            "token_uri": "https://oauth2.googleapis.com/token",
            "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
            "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-5rmdm%40xxxxx.iam.gserviceaccount.com"
          }
    
        admin.initializeApp({
            credential: admin.credential.cert(serviceAccount),
            storageBucket: "xxxxx-xxxx" // use your storage bucket name
        });
    
    
        const app = express();
        app.use(bodyParser.urlencoded({ extended: false }));
        app.use(bodyParser.json());
    app.post('/uploadFile', (req, response) => {
        response.set('Access-Control-Allow-Origin', '*');
        const busboy = new Busboy({ headers: req.headers })
        let uploadData = null
        busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
            const filepath = path.join(os.tmpdir(), filename)
            uploadData = { file: filepath, type: mimetype }
            console.log("-------------->>",filepath)
            file.pipe(fs.createWriteStream(filepath))
          })
    
          busboy.on('finish', () => {
            const bucket = admin.storage().bucket();
            bucket.upload(uploadData.file, {
                uploadType: 'media',
                metadata: {
                  metadata: { firebaseStorageDownloadTokens: uuid,
                    contentType: uploadData.type,
                  },
                },
              })
    
              .catch(err => {
                res.status(500).json({
                  error: err,
                })
              })
          })
          busboy.end(req.rawBody)
       });
    
    
    
    
    exports.widgets = functions.https.onRequest(app);
    
    0 讨论(0)
  • 2020-11-22 02:03

    I saw this on the admin storage doc

    const options = {
      version: 'v4',
      action: 'read',
      expires: Date.now() + 15 * 60 * 1000, // 15 minutes
    };
    
    // Get a v4 signed URL for reading the file
    const [url] = await storage
      .bucket(bucketName)
      .file(filename)
      .getSignedUrl(options);
    
    console.log('Generated GET signed URL:');
    console.log(url);
    console.log('You can use this URL with any user agent, for example:');
    console.log(`curl '${url}'`);
    
    0 讨论(0)
  • 2020-11-22 02:04

    As of firebase 6.0.0 I was able to access the storage directly with the admin like this:

    const bucket = admin.storage().bucket();
    

    So I didn't need to add a service account. Then setting the UUID as referenced above worked for getting the firebase url.

    0 讨论(0)
  • 2020-11-22 02:05

    Here's an example on how to specify the download token on upload:

    const UUID = require("uuid-v4");
    
    const fbId = "<YOUR APP ID>";
    const fbKeyFile = "./YOUR_AUTH_FIlE.json";
    const gcs = require('@google-cloud/storage')({keyFilename: fbKeyFile});
    const bucket = gcs.bucket(`${fbId}.appspot.com`);
    
    var upload = (localFile, remoteFile) => {
    
      let uuid = UUID();
    
      return bucket.upload(localFile, {
            destination: remoteFile,
            uploadType: "media",
            metadata: {
              contentType: 'image/png',
              metadata: {
                firebaseStorageDownloadTokens: uuid
              }
            }
          })
          .then((data) => {
    
              let file = data[0];
    
              return Promise.resolve("https://firebasestorage.googleapis.com/v0/b/" + bucket.name + "/o/" + encodeURIComponent(file.name) + "?alt=media&token=" + uuid);
          });
    }
    

    then call with

    upload(localPath, remotePath).then( downloadURL => {
        console.log(downloadURL);
      });
    

    The key thing here is that there is a metadata object nested within the metadata option property. Setting firebaseStorageDownloadTokens to a uuid-v4 value will tell Cloud Storage to use that as its public auth token.

    Many thanks to @martemorfosis

    0 讨论(0)
  • 2020-11-22 02:06

    You'll need to generate a signed URL using getSignedURL via the @google-cloud/storage NPM module.

    Example:

    const gcs = require('@google-cloud/storage')({keyFilename: 'service-account.json'});
    // ...
    const bucket = gcs.bucket(bucket);
    const file = bucket.file(fileName);
    return file.getSignedUrl({
      action: 'read',
      expires: '03-09-2491'
    }).then(signedUrls => {
      // signedUrls[0] contains the file's public URL
    });
    

    You'll need to initialize @google-cloud/storage with your service account credentials as the application default credentials will not be sufficient.

    UPDATE: The Cloud Storage SDK can now be accessed via the Firebase Admin SDK, which acts as a wrapper around @google-cloud/storage. The only way it will is if you either:

    1. Init the SDK with a special service account, typically through a second, non-default instance.
    2. Or, without a service account, by giving the default App Engine service account the "signBlob" permission.
    0 讨论(0)
提交回复
热议问题