【问题标题】:How to upload an image to Firebase? Is it possible?如何将图像上传到 Firebase?是否可以?
【发布时间】:2019-04-12 04:01:53
【问题描述】:

我正在尝试将图像上传到 Firebase 云功能。我认为我已经阅读了有关此问题的整篇文章,但我无法找到解决方案。

我用过“formidable.IncomingForm()”、“multer”和“busboy”,但没有人在工作。

我明白我必须使用 busboy。我想与这个库分享我的最后一个代码。

app.post('/',function(req,res) {
    var busboy = new Busboy({headers: req.headers});
    var files = 0, finished = false;
    busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
        console.log('File [' + fieldname + ']: filename: ' + filename);
        console.log("Uploading: " + filename);
        ++files;
      //  const temp = os.tmpdir();
      //  var path = temp.writeFileSync(file);
       let path=os.tmpdir()+"/"+filename
       let p=fs.writeFileSync(path,file)
       console.log(path)
        var fstream = fs.createWriteStream(path);
        fstream.on('finish', function () {
            if (--files === 0) {
                // Upload a local file to a new file to be created in your bucket.
                bucket.upload(path,function (err, file) {

                    if (!err) {
                        console.log("Uploaded: " + path);
                        res.json({
                            uploaded: true,
                            created_at: new Date().getTime(),
                            filename: filename,
                            mimeType: mimetype
                        });
                    }else{
                        console.error("err: " + err);
                        var error = new ErrorResponse(400);
                        error.errors+=err;
                        res.json(error);
                    }
                });
            }
        });
        file.pipe(fstream);
    })
    req.pipe(busboy);
})

此代码在我的本地服务器中成功上传文件,但在 Firebase Cloud 函数中失败。

我的发帖请求是:

问题是函数 "busboy.on('file'..." 永远不会执行

【问题讨论】:

  • 您想将图像存储在哪里?如果我没有弄错,您正在使用 firebase 函数将图像上传到 firebase 存储。对吗?
  • 是的,完全正确!但问题出在 firabase-function 上,因为它没有获取文件。换句话说,函数“busboy.on”永远不会执行
  • 是的!只有一张图片

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


【解决方案1】:

因为我是busboy 的菜鸟。我会坚持使用最受欢迎的库multer

使用multer's 内存存储,将图像作为缓冲区上传。并使用该缓冲区将图像上传到存储桶。

试试下面的 sn-p:

var multer = require('multer')
// using the in-memory storage
var upload = multer()

// use the same paramter you are using for uploading from postman
app.post('/', upload.single('file'), function(req, res) {
  const fileBuff = req.file.buffer
  const fileName = req.file.filename
  const mimeType = req.file.mimetype


  const file = myBucket.file(fileName);

  file.save(fileBuff)
    .then(success => {
      res.json({
        uploaded: true,
        created_at: new Date().getTime(),
        filename: fileName,
        mimeType: mimeType
      });
    })
    .catch(err => {
      console.error("err: " + err);
      var error = new ErrorResponse(400);
      error.errors += err;
      res.json(error);
    })
})

【讨论】:

  • 我的问题不在于“临时文件”,因为该行从未执行过。 multer 和 formidable.IncomingForm() 也是如此。它在本地有效,但在 Firebase-cloud 功能中无效。当我执行你的例子时:“req.file”是空的,尽管我发送了一个文件
  • 它工作正常。我不知道为什么jaja。我还有一个疑问。变量“fileBuff”。我该如何填写??
  • Multer 将其放入 req.file.buffer。你不必做任何事情。
  • 问题是我有以下错误:TypeError: Cannot read property 'buffer'未定义的我错误地删除了这一行,这项工作但文件上传为空。
  • 我添加了一些更改,此代码需要工作!感谢您的帮助!
【解决方案2】:

Harroon Khan 的解决方案不适用于您当前的测试的原因是因为您实际上并没有使用邮递员将文件发送到您的端点,您只是发送 文件名。 p>

这是有问题的,因为您的端点只能在您的本地开发环境中工作。

在使用邮递员发送实际文件时,您应该尝试他的解决方案。这是一个小屏幕截图,向您展示如何切换它:

使用 Postman 上传文件

【讨论】:

  • 我显然使用“文件”作为类型
【解决方案3】:

这段代码对我有用!我不知道为什么,但我必须写一个文件,然后读取它,最后,将我读取的数据上传到存储中

ex.post('/upload', function(req, res) {
  const busboy = new Busboy({
    headers: req.headers
  });
  const tmpdir = os.tmpdir();

  // This object will accumulate all the fields, keyed by their name
  const fields = {};
  // This object will accumulate all the uploaded files, keyed by their name.
  const uploads = {};
  // This code will process each non-file field in the form.
  busboy.on('field', (fieldname, val) => {
    // TODO(developer): Process submitted field values here
    console.log(`Processed field ${fieldname}: ${val}.`);
    fields[fieldname] = val;
  });
  const fileWrites = [];
  // This code will process each file uploaded.
  busboy.on('file', (fieldname, file, filename) => {
    // Note: os.tmpdir() points to an in-memory file system on GCF
    // Thus, any files in it must fit in the instance's memory.
    console.log(`Processed file ${filename}`);
    const filepath = path.join(tmpdir, filename);
    console.log("PATH: "+filepath)
    uploads[fieldname] = filepath;
    const writeStream = fs.createWriteStream(filepath);
    file.pipe(writeStream);
    // File was processed by Busboy; wait for it to be written to disk.
    const promise = new Promise((resolve, reject) => {
      file.on('end', () => {
        writeStream.end();
      });
      writeStream.on('finish', resolve);
      writeStream.on('error', reject);
    });
    fileWrites.push(promise);
  });

  // Triggered once all uploaded files are processed by Busboy.
  // We still need to wait for the disk writes (saves) to complete.
  busboy.on('finish', () => {
    Promise.all(fileWrites).then(() => {
      // TODO(developer): Process saved files here
      for (const name in uploads) {
        const file = uploads[name];
        let data = fs.readFileSync(uploads[name]);
        const filetoGCF = bucket.file("file-name");
        filetoGCF.save(data)
          .then(success => {
            res.json({
              uploaded: true,
              created_at: new Date().getTime(),
              filename: 'file-name',
            });

          })
        fs.unlinkSync(file);
      }
    }).catch((err)=>{
      res.json({
        uploaded: false,
        error: err,
      });
    });
  });

  busboy.end(req.rawBody);
})

感谢 Haroon Khan 的帮助!

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2018-08-20
    • 2022-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多