使用node.js上传Firebase存储中文件夹中的文件

g52tjvyc  于 2023-03-01  发布在  Node.js
关注(0)|答案(3)|浏览(125)

我是上传文件的新手,我想上传不同产品的图像到Firebase存储和应用程序中需要的另一个文件,一个产品可以有许多图像,所以我想为每个产品创建一个文件夹,文件夹的名称将是产品的ID。
在代码中:我使用@google-cloud/storage库将文件上传到firebase存储,但我在文档中搜索,没有办法创建一个文件夹,然后将其上传到文件夹。

这里是我的代码:

我创建了multer的中间件,将其传递到端点,检查类型为文件。

const express = require("express");
const Multer = require("multer");
const { Storage } = require("@google-cloud/storage")

const storage = new Storage({
    projectId: process.env.PROJECT_FIREBASE_ID,
    keyFilename: "hawat-service.json",
});
const bucket = storage.bucket(process.env.BUCKET_NAME);

const multer = Multer({
    storage: Multer.memoryStorage(),
    fileFilter: (req, file, cb) => {
        checkFileType(req, file, cb);
    }
})

const checkFileType = (req ,file, cb) => {
    if (file.fieldname == 'cover' || file.fieldname == 'images') {
        if (!file.originalname.match(/\.(jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF)$/)) {
              req.error = new Error( "Only images are allowed")
            return  cb(null, false);
        }
    } else if (file.fieldname == 'card' || file.fieldname == 'licence') {
        if (!file.originalname.match(/\.(pdf|jpg|JPG|jpeg|JPEG|png|PNG|gif|GIF)$/)) {
           req.error = new Error("Only images and pdf are allowed")
            return  cb(null, false);

        }
    }
    return cb(null, true)
}

module.exports = (req, res, next) => {

    return multer.fields([{ name: 'cover', maxCount: 1 },
    { name: 'images', maxCount: 5 }, { name: 'card', maxCount: 1 },
    { name: 'licence', maxCount: 1 }
])
        (req, res, () => {
            if (req.error) return res.status(400).send( {message : req.error.message })
            next()
        })
       
}

上传文件的功能是

const express = require("express");
const Multer = require("multer");
const { Storage } = require("@google-cloud/storage");

const storage = new Storage({
  projectId: process.env.PROJECT_FIREBASE_ID,
  keyFilename: "hawat-service.json",
});

const bucket = storage.bucket(process.env.BUCKET_NAME);

module.exports = {
  upload: async ( file) => {
    return new Promise((resolve, reject) => {
      let newFileName = `${file.originalname}_${Date.now()}`;
  
      let fileUpload = bucket.file(newFileName);

      const createStream = fileUpload.createWriteStream({
          metadata: {
              contentType: file.mimetype
          }
      });

      createStream.on('error', (error) => {
        console.log("error in uploading is" , error)
          reject('Something is wrong! Unable to upload at the moment.');
      });

      createStream.on('finish', () => {
          // The public URL can be used to directly access the file via HTTP.
          const url = `https://storage.googleapis.com/${bucket.name}/${fileUpload.name}`;
       
      //   storage.bucket(process.env.BUCKET_NAME).file(fileUpload.name).makePublic();
     

             resolve(url);
      });

      createStream.end(file.buffer);
  });

该端点是

router.post('/add-product' , auth, multer , seller.onAddProduct)

函数onAddProduct是可以从用户接收多个文件的函数。
那么我如何为每个产品创建一个文件夹,然后上传文件夹中的文件?
另外,我如何删除创建后的文件夹?

yquaqz18

yquaqz181#

我使用的方法与您使用的方法不同,但您可以使用我的解决方案作为案例研究

await storage.bucket(bucketName).upload(filename, {
        destination:"{Foldername}/{Filename}",
})
c7rzv4ha

c7rzv4ha2#

谷歌云存储中的文件夹并不是一个真正的东西,正如你在这个documentation中看到的:
gsutil在云存储服务支持的“平面”名称空间上提供了分层文件树的假象。对于该服务,对象gs://your-bucket/abc/def.txt只是一个名称中碰巧包含"/"字符的对象。没有"abc"目录,只有一个具有给定名称的对象
因此,您在云存储中看到的文件夹只是模拟文件夹结构的另一个对象,真正重要的是对象路径。
在您的情况下,有2种方法可以去做你想做的事情,你可以:

  • 通过创建一个以斜杠结尾的对象来创建一个模拟的空目录。例如,要在bucket的根目录创建一个名为foo的子目录,您需要创建一个名为foo/的空对象(大小为0),然后上传文件及其完整路径。
  • 只需上传包含所需“子目录”的完整路径的文件,当您从GCS获取它时,它看起来就像位于模拟目录中。

就我个人而言,我会使用后者,因为你会达到同样的结果,只有1步,而不是2。

wdebmtf2

wdebmtf23#

如果要在云存储中创建空文件夹,可以执行以下操作:

const userId = "your_user_id"

// Folder name. Notice the slash at the end of the path
const folderName = `users/${userId}/`;

// Create a folder
await bucket.file(folderName).save("");

创建新文件夹后,您可以通过设置其目标位置将文件上传到该文件夹:

const destination = `${folderName}${fileName}`;

await bucket.upload(file, {
  destination,
})

但实际上您不需要单独创建文件夹。您可以如上所述在bucket.upload(...)中为文件设置完整的目标位置。

相关问题