簡體   English   中英

Firebase storage-resize-images 未由存儲桶上傳觸發

[英]Firebase storage-resize-images not triggered by bucket upload

我正在使用 Firebase function 將圖像上傳到存儲。

我安裝了擴展firebase/storage-resize-images@0.1.29

當我直接在儀表板中上傳圖像時,會發生調整大小。

但是,使用我的函數上傳的圖像不會觸發調整大小。

我在這里想念什么?

async function migrateImageFromURL (folder, url, name, callback) {
  const {filePath, fileName} = await downloadRemoteUrlImage(url, name.split('.')[0])

  const bucket = admin.storage().bucket();
  const destination = `dev/${folder}/${fileName}`;

  try {
      await bucket.upload(filePath, {
          destination: destination,
          gzip: true,
          metadata: {
            fileName,
            contentType: `image/${fileName.split('.')[1]}`,
            cacheControl: 'public, max-age=31536000',
          },
      });
      callback(destination)
  }
  catch (e) {
      throw new Error("uploadLocalFileToStorage failed: " + e);
  }

 return ''
};

用busyboy創建雲busyboy

  • 創建示例 firebase function

  • 復制package.json的代碼

  • 運行命令安裝節點模塊

    npm run
  • 復制index.js的代碼

  • 要為您的服務帳戶生成私鑰文件:

    • 在 Firebase 控制台中,打開 Settings > Service Accounts

    • 單擊 Generate New Private Key,然后單擊 Generate Key 進行確認。

    • 選擇Node Js

    • 安全地存儲包含密鑰的 JSON 文件。

  • 復制 function 目錄下的 firebase firebase-admin-sdk.json文件

  • 將 function 部署到 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;
}

package.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM