一尘不染

如何使用Node.js将base64编码的图像(字符串)直接上传到Google Cloud Storage存储桶?

node.js

目前,我正在使用@ google-cloud / storage NPM软件包将文件直接上传到Google Cloud
Storage存储桶。这需要一些技巧,因为我只有图像的base64编码的字符串。我必须:

  • 解码字符串
  • 将其另存为文件
  • 将文件路径发送到以下脚本以上传到Google Cloud Storage
  • 删除本地文件

我想避免将文件完全存储在文件系统中,因为我正在使用Google App
Engine,并且如果由于某种原因删除操作不起作用,我不想使文件系统超载/将垃圾文件留在那里。这是我的上传脚本现在的样子:

// Convert the base64 string back to an image to upload into the Google Cloud Storage bucket
var base64Img = require('base64-img');
var filePath = base64Img.imgSync(req.body.base64Image, 'user-uploads', 'image-name');

// Instantiate the GCP Storage instance
var gcs = require('@google-cloud/storage')(),
    bucket = gcs.bucket('google-cloud-storage-bucket-name');

// Upload the image to the bucket
bucket.upload(__dirname.slice(0, -15) + filePath, {
    destination: 'profile-images/576dba00c1346abe12fb502a-original.jpg',
    public: true,
    validation: 'md5'
}, function(error, file) {

    if (error) {
        sails.log.error(error);
    }

    return res.ok('Image uploaded');
});

无论如何,是否可以直接上传图像的base64编码字符串,而不必将其转换为文件然后使用路径上传?


阅读 293

收藏
2020-07-07

共1个答案

一尘不染

我认为,解决方案是使用file.createWriteStreambucket.upload功能包装在Google Cloud Node
SDK中的功能。

我对流媒体的经验很少,所以如果不能立即使用,请尝试忍受。

首先,我们需要获取base64数据并将其放入流中。为此,我们将包括该stream库,从base64数据创建一个缓冲区,然后将该缓冲区添加到流的末尾。

var stream = require('stream');
var bufferStream = new stream.PassThrough();
bufferStream.end(Buffer.from(req.body.base64Image, 'base64'));

有关解码base64和创建流的更多信息
然后,我们将把流传输到file.createWriteStream函数创建的写入流中。

var gcs = require('@google-cloud/storage')({
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

//Define bucket.
var myBucket = gcs.bucket('my-bucket');
//Define file & file name.
var file = myBucket.file('my-file.jpg');
//Pipe the 'bufferStream' into a 'file.createWriteStream' method.
bufferStream.pipe(file.createWriteStream({
    metadata: {
      contentType: 'image/jpeg',
      metadata: {
        custom: 'metadata'
      }
    },
    public: true,
    validation: "md5"
  }))
  .on('error', function(err) {})
  .on('finish', function() {
    // The file upload is complete.
  });

信息上file.createWriteStream文件文档bucket.upload以及bucket.upload在Node
SDK方法的代码

因此,上述代码的工作方式是定义要放入文件的存储桶,然后定义文件和文件名。我们未在此处设置上传选项。然后,bufferStream我们将刚刚创建的变量通过管道传递到file.createWriteStream我们之前讨论的方法中。在这些选项中,我们定义元数据和您要实现的其他选项。直接查看Github上的Node代码非常有帮助,以了解它们如何分解bucket.upload功能,并建议您也这样做。最后,我们会附上几个事件,说明上传何时完成以及何时出错。

2020-07-07