【问题标题】:How to upload files to firebase storage using rest api in unity如何统一使用rest api将文件上传到firebase存储
【发布时间】:2022-08-18 19:20:26
【问题描述】:

我想使用统一的其余 API 将文件上传到 Firebase 存储。这就像单击浏览按钮,浏览本地存储,选择文件,然后上传。

我该怎么做呢?

    标签: firebase file unity3d google-cloud-firestore upload


    【解决方案1】:

    使用busyboy 创建云函数

    • 创建示例 firebase 函数

    • 复制package.json的代码

    • 运行命令安装节点模块

      npm run
      
    • 复制index.js的代码

    • 要为您的服务帐户生成私钥文件:

      • 在 Firebase 控制台中,打开设置 > Service Accounts

      • 单击 Generate New Private Key,然后单击 Generate Key 进行确认。

      • 选择Node Js

      • 安全地存储包含密钥的 JSON 文件。

    • 复制函数目录下的firebase-admin-sdk.json文件

    • 将功能部署到 Firebase

      firebase deploy --only functions
      
    • 从 Firebase 控制台获取 http endpoint

    索引.js

    const functions = require("firebase-functions");
    const os = require("os");
    const path = require("path");
    const spawn = require("child-process-promise").spawn;
    
    //To enable Cross AXIS 
    //Change to False to avoid DDOS
    const cors = require("cors")({ origin: true });
    
    //Parse Files
    const Busboy = require("busboy");
    
    //Files System
    const fs = require("fs");
    
    var gcconfig = {
        // Get the project ID from firebaserc
      projectId: "<project_id>",
    //   Write the name of the file in the root director which contains the private key of firebase-admin-sdk
      keyFilename: "firebase-admin-sdk.json"
    };
    
    // const gcs = require("@google-cloud/storage")(gcconfig);
    const {Storage} = require('@google-cloud/storage');
    const gcs = new Storage(gcconfig);
    
    exports.uploadFile = functions.https.onRequest((req, res) => {
    
      //Allowing CROSS SITE
      cors(req, res, () => {
        if (req.method !== "POST") {
          return res.status(500).json({
            message: "Not allowed"
          });
        }
    
        console.log("Starting BusBOY");
        const busboy = Busboy({ headers: req.headers});
        let uploadData = null;
        
        //File parsing
        busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
    
            // Firebase cloudfunction will have some tmpdirectory tmpdir
            // It will be cleaned up after execution
          console.log("File function reached ");
    
          console.log("Temp folder is "+os.tmpdir());
          console.log("File name is "+filename.filename);
    
          const filepath = path.join(os.tmpdir(),filename.filename);
    
          console.log("Location of file is "+filepath);
          uploadData = { file: filepath, type: mimetype };
    
          console.log("Writing to temp file storage");
          //Writing file to storage
          file.pipe(fs.createWriteStream(filepath));
    
          //Extra Details such as limit error
          file.on('limit', () => {
            console.log("Reached size limit");
            debugLog(options, `Size limit reached for ${field}->${filename.filename}, bytes:${getFilesizeInBytes(filename)}`);
          });
            file.on('end', () => {
            const size = getFilesizeInBytes(filename.filename);
            console.log("File size is "+size+" bytes");
           });
           file.on('error', (err) => {
            console.log("File format error");
           });
    
        });
    
        //For Form data Listener
        // busboy.on("field",()=>{
    
        // });
    
        // Finishes the whole process, only upload after that
        busboy.on("finish", () => {
    
            // Firebase storage, Inside the console itself
            // Copy the folder location
            // gs://<Project_id>.appspot.com
            // Remove the gs String
    
          console.log("Finished BusBoy");
          var your_project_id="<your_project_id>.appspot.com";
    
          const bucket = gcs.bucket(your_project_id);
          console.log("Uploading Image to firebase");
          
          bucket
            .upload(uploadData.file, {
              uploadType: "media",
              metadata: {
                metadata: {
                  contentType: uploadData.type
                }
              }
            })
            .then(() => {
                // Success
              console.log("Uploaded Successfully");
              res.status(200).json({
                message: "It worked!"
              });
            })
            .catch(err => {
                // Error
                console.log("Error while uploading");
    
              res.status(500).json({
                error: err
              });
            });
        });
    
        //End the parsing
        console.log("End Parsing");
        busboy.end(req.rawBody);
    
      });
    });
    
    //Finding the file size from the filename
    function getFilesizeInBytes(filename) {
      var stats = fs.statSync(filename);
      var fileSizeInBytes = stats.size;
      return fileSizeInBytes;
    }
    

    包.json

    {
      "name": "functions",
      "description": "Cloud Functions for Firebase",
      "scripts": {
        "serve": "firebase emulators:start --only functions",
        "shell": "firebase functions:shell",
        "start": "npm run shell",
        "deploy": "firebase deploy --only functions:uploadFile",
        "logs": "firebase functions:log"
      },
      "engines": {
        "node": "14"
      },
      "main": "index.js",
      "dependencies": {
        "firebase-admin": "^9.8.0",
        "firebase-functions": "^3.14.1",
        "@google-cloud/storage": "^6.0.1",
        "busboy": "^1.6.0",
        "child-process-promise": "^2.2.1",
        "cors": "^2.8.5"
      },
      "devDependencies": {
        "firebase-functions-test": "^0.2.0"
      },
      "private": true
    }
    
    

    更多细节

    结帐https://github.com/katmakhan/firebase-course/tree/master/Firebase%20Cloud%20Function/Image%20Uploader

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2020-11-26
      • 1970-01-01
      • 2021-08-16
      • 2017-07-03
      • 2020-04-08
      • 2020-02-28
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多