使用 multer 将图像上传到 Firebase 存储问题

Posted

技术标签:

【中文标题】使用 multer 将图像上传到 Firebase 存储问题【英文标题】:Upload image using multer to Firebase Storage issue 【发布时间】:2019-08-31 05:29:20 【问题描述】:

您好,我正在尝试使用 Node.js/multer 将图像上传到 firebase 存储(注意:我知道我可以在客户端执行此操作,但这需要在服务器端工作)。我遇到了这个问题:

TypeError: storage.ref 不是函数

我尝试通过添加 import 'firebase/storage'; 来解决问题,正如其他 Stack Overflow 所建议的那样,但这并没有奏效。

路由器:

import FirebaseManager, FirebaseReferences from '../database_manager';

router.post("/:uuid/image", upload.single("file"), (req, res) => 
    const tempPath = req.file.path;
    const ext = path.extname(req.file.originalname).toLowerCase();

    if (ext === ".png" || ext === ".jpg") 
        FirebaseManager.upload_image(FirebaseReferences.Images, 'test', req.file)
        res.status(200).contentType("text/plain").end("File uploaded!");
     else 
        try 
            fs.unlinkSync(tempPath);
         catch (err) 
            res.status(400).send(err.message);
        
        res.status(403).contentType("text/plain").end("Only .png/jpg files are allowed!");
    
  
);

Firebase 管理器:

var admin = require('firebase-admin');
import firebase = require('firebase/app');
import 'firebase/database';
import 'firebase/storage';

// Access the real-time database in the initialized application.
const FirebaseApp: firebase.app.App = admin.initializeApp(
  credential: admin.credential.cert(
    projectId: '',
    clientEmail: '',
    privateKey: ''
  ),
  databaseURL: 'https://.firebaseio.com'
);
const db: firebase.database.Database = FirebaseApp.database();
const storage: firebase.storage.Storage = FirebaseApp.storage();

export function upload_image(ref: FirebaseReferences, filename: string,
        file: any): string 

        var upload_loc = ref.toString() + '/' + filename;
        var upload_ref = storage.ref().child(upload_loc);

        upload_ref.put(file).then(function(snapshot) 
            snapshot.ref.getDownloadURL().then(function(downloadURL) 
                console.log('File available at', downloadURL);
                return downloadURL;
            );
        , function(error) 
            console.log("FirebaseManager, upload_image(): " + error);
            throw error;
        );

        return 'error';

还可以将Express.Multer.File 类型上传到存储吗?如果不是,我如何将该类型转换为 File 类型?

node 10.2.1
multer 1.4.1
firebase ^5.7.3
firebase-admin ^6.5.0

【问题讨论】:

看起来它在您的 upload_image 函数中的存储对象上找不到 ref。我不完全确定您是否需要先调用存储桶。此外,我过去在导出函数之外定义了 express 和 code 时遇到了一些问题。您能否在您的upload_image 函数中不调用storage.ref(),而是尝试调用admin.storage().bucket().ref() 【参考方案1】:

admin.initializeApp 的配置中缺少 storageBucket

admin.initializeApp(
    credential: admin.credential.cert(serviceAccount),
    storageBucket: "<BUCKET_NAME>.appspot.com"
);

https://firebase.google.com/docs/storage/admin/start

【讨论】:

以上是关于使用 multer 将图像上传到 Firebase 存储问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Multer 将带有 fetch 的图像上传到 Express

使用 multer 将多个图像上传到 AWS S3

如何使用 multer 和 NodeJS 将图像上传到 GCS 存储桶?

使用 Multer 将图像上传到 mongoDB 时 Heroku 出错

使用 multer-s3 nodejs 将图像上传到亚马逊 s3

使用 multer 和 nodejs 将图像上传到谷歌云存储时出错