目前,我正在使用@ google-cloud / storage NPM软件包将文件直接上传到Google Cloud Storage存储桶。这需要一些技巧,因为我只有图像的base64编码的字符串。我必须:
我想避免将文件完全存储在文件系统中,因为我正在使用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编码字符串,而不必将其转换为文件然后使用路径上传?
我认为,解决方案是使用file.createWriteStream该bucket.upload功能包装在Google Cloud Node SDK中的功能。
file.createWriteStream
bucket.upload
我对流媒体的经验很少,所以如果不能立即使用,请尝试忍受。
首先,我们需要获取base64数据并将其放入流中。为此,我们将包括该stream库,从base64数据创建一个缓冲区,然后将该缓冲区添加到流的末尾。
stream
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功能,并建议您也这样做。最后,我们会附上几个事件,说明上传何时完成以及何时出错。
bufferStream