【问题标题】:Upload an image into Firebase Storage from a callable https cloud function从可调用的 https 云函数将图像上传到 Firebase 存储
【发布时间】:2020-11-10 20:25:29
【问题描述】:

我想从可调用的 https 云函数将图像上传到 Firebase 存储,但我不知道该怎么做。

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp();

const storageBucket = admin.storage().bucket('gs://xxxxx.appspot.com');

exports.test_upload = functions.https.onRequest(async (request, response) => {

    var base64Img = "data:image/jpeg;base64,/9j/4AAQSkZJRg...AoNDQoIC";

    let filename = new Date().getTime() + '.jpg';

    await storageRef.child('/destination/'+filename).putString(base64Img, 'data_url').then(function(snapshot) {

        snapshot.ref.getDownloadURL().then(async (url) => { 
            
            console.log(url);

        });

    });


    response.status(200).send("Done!");

});

你能帮我理解一下,该怎么做吗?

非常感谢

更新:2020/07/22

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp();

const storageBucket = admin.storage().bucket('perfume-group.appspot');

const {Storage} = require('@google-cloud/storage');

const storage = new Storage({keyFilename: 'perfume-group-key.json'});

exports.test_upload = functions.https.onRequest(async (request, response) => {

    /// CAS 1: Don't works
    // Source: https://stackoverflow.com/questions/53969468/how-to-store-files-in-firebase-using-node-js

    const fileUrl = 'https://i.pinimg.com/originals/4a/9d/f8/4a9df83774219e0d02bbb9e5dc9be125.jpg';

    const opts = {
        destination: 'destination/file1.jpg',
        metadata: {
            contentType: 'image/jpeg'
        }
    };

    firebase.storage().bucket().upload(fileUrl, opts);

    //////////////////////////////////////////////////

    /// CASE 2: Don't works

    const bucket = storage.bucket('perfume-group.appspot.com');

    bucket.upload(fileUrl, {
        destination: 'destination/file2.jpg',
        metadata: {
            contentType: 'image/jpeg'
        }
    });

    //////////////////////////////////////////////////

    /// CASE 3: Don't works

    const options = {
      destination: 'destination/file3.jpg',
    };

    // Downloads the file
    await storage.bucket('perfume-group.appspot.com').file(fileUrl).download(options);

    //////////////////////////////////////////////////


    response.status(200).send("Done!");

});

有没有可行的例子?
赞这个页面:https://firebase.google.com/docs/storage/web/upload-files

我了解如何将数据添加到数据库,但不清楚如何将文件添加到存储

为什么这个解释不起作用? -> https://googleapis.dev/nodejs/storage/latest/Bucket.html#upload

const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
const bucket = storage.bucket('albums');

await bucket.upload('https://i.pinimg.com/originals/4a/9d/f8/4a9df83774219e0d02bbb9e5dc9be125.jpg', function(err, file, apiResponse) {
      
});

毕竟,我的存储空间还是空的。

【问题讨论】:

    标签: node.js firebase google-cloud-functions google-cloud-storage


    【解决方案1】:

    我花了一段时间才弄明白,所以把它贴在这里以防万一它对同一条船上的其他人有所帮助。我正在使用强大的无服务器来解析请求。

    const functions = require("firebase-functions");
    const formidable = require("formidable-serverless");
    const admin = require("firebase-admin");
    admin.initializeApp();
    
    exports.uploadFile = functions.https.onRequest((req, res) => {
      var form = new formidable.IncomingForm();
      form.parse(req, async (err, fields, files) => {
        var file = files.fileToUpload;
        if (err || !file) {
          res.status(500).send(err);
          return;
        }
        var filePath = file.path;
        var filename = file.name;
        var bucket = admin.storage().bucket("nameOfBucket.appspot.com");
    
        const options = {
          destination: "profile/" + filename,
          contentType: "image/jpeg", //file.path
        };
    
        //upload image
        await bucket
          .upload(output, options)
          .catch((error) => res.status(500).send(error));
        await res.status(200).send("success");
      });
    });
    

    HTML表单代码:

    <form action="https://yourCloudFunctionsUrl.cloudfunctions.net/uploadFile" method="post" enctype="multipart/form-data">
            <input type="file" accept="image/*" name="fileToUpload" >
            <input type="submit" value="upload">
    </form>
    

    【讨论】:

    • 这太好了,感谢您抽出宝贵时间将其放在这里。
    【解决方案2】:

    您似乎试图在您的 Cloud Functions 代码中使用 Firebase JavaScript SDK for Cloud Storage,但这是不可能的。适用于 Cloud Storage 的 Firebase JavaScript SDK 只能在网络客户端中使用。

    在服务器端环境中,您需要使用 Firebase Admin SDK 与 Cloud Storage 交互。在这种情况下,您最终将使用Node.js SDK for Cloud Storage 中的pre-initialized version

    所以要了解如何在您的 Cloud Functions 中上传图片,我会搜索 Node.js SDK for Cloud Storage upload file。这导致:

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2021-10-28
      • 2021-04-21
      • 2018-04-09
      • 2019-06-23
      • 2017-09-25
      相关资源
      最近更新 更多