上传缓冲区到谷歌云存储

30

我正在尝试将表单上传的文件的缓冲区保存到Google Cloud存储中,但是似乎Google Node SDK只允许上传具有给定路径的文件(读/写流)。

这是我在AWS(S3)中使用的内容-在Google Node SDK中是否还有类似的东西?

var fileContents = new Buffer('buffer');

var params = {
  Bucket: //bucket name
  Key: //file name
  ContentType: // Set mimetype
  Body: fileContents 
};

s3.putObject(params, function(err, data) {
// Do something 
});
到目前为止,我发现唯一的方法是将缓冲区写入磁盘,使用SDK上传文件(指定新文件的路径),然后在成功上传后删除该文件 - 这种方法的缺点是整个过程明显较慢,以至于似乎不可行使用Google存储。是否有任何方法可以绕过/上传缓冲区?
5个回答

28

.save 拯救全局!下面是一些代码,我保存了我创建的 "pdf"。

https://googleapis.dev/nodejs/storage/latest/File.html#save

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

const gc = new Storage({
  keyFilename: path.join(__dirname, "./path to your service account .json"),
  projectId: "your project id",
});

      const file = gc.bucket(bucketName).file("tester.pdf");
      file.save(pdf, (err) => {
        if (!err) {
          console.log("cool");
        } else {
          console.log("error " + err);
        }
      });

10

这其实很简单:

  let remotePath = 'some/key/to/store.json';
  let localReadStream = new stream.PassThrough();
  localReadStream.end(JSON.stringify(someObject, null, '   '));

  let remoteWriteStream = bucket.file(remotePath).createWriteStream({ 
     metadata : { 
        contentType : 'application/json' 
     }
  });

  localReadStream.pipe(remoteWriteStream)
  .on('error', err => {
     return callback(err);      
  })
  .on('finish', () => {
     return callback();
  });

4
请详细阐述回答。 - UmarZaii
缺少 const stream = require('stream'); - throbi
1
在这个例子中,multer 的内存缓冲对象在哪里? - Colin
远程路径中的斜杠将被替换为下划线,并且不会创建“文件夹”。 - Guilherme Ferreira

9

1
正如其他答案中提到的那样,云存储包现在支持 .save,它正是您所要求的功能:https://googleapis.dev/nodejs/storage/latest/File.html#save - ArtoAle

6
以下代码摘自谷歌示例。该示例假定您已使用 multer 或类似的东西,并且可以通过 req.file 访问文件。您可以使用类似以下的中间件将文件流式传输到云存储:
function sendUploadToGCS (req, res, next) {
  if (!req.file) {
    return next();
  }

  const gcsname = Date.now() + req.file.originalname;
  const file = bucket.file(gcsname);

  const stream = file.createWriteStream({
    metadata: {
      contentType: req.file.mimetype
    },
    resumable: false
  });

  stream.on('error', (err) => {
    req.file.cloudStorageError = err;
    next(err);
  });

  stream.on('finish', () => {
    req.file.cloudStorageObject = gcsname;
    file.makePublic().then(() => {
      req.file.cloudStoragePublicUrl = getPublicUrl(gcsname);
      next();
    });
  });

  stream.end(req.file.buffer);
}

1
getPublicUrl() 函数在哪里? - Shivam Dawar

4

我有这个适合我的方法:

const destFileName = `someFolder/${file.name}`;
const fileCloud = this.storage.bucket(bucketName).file(destFileName);
    fileCloud.save(file.buffer, {
        contentType: file.mimetype
     }, (err) => {
        if (err) {
        console.log("error");
     }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接