将缓冲区上传到谷歌云存储

Posted

技术标签:

【中文标题】将缓冲区上传到谷歌云存储【英文标题】:Uploading a buffer to google cloud storage 【发布时间】:2016-07-31 19:34:48 【问题描述】:

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

这是我用于 AWS (S3) 的 - Google 节点 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 存储似乎不可行。是否有任何解决方法/上传缓冲区的方法?

【问题讨论】:

【参考方案1】:

.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);
        
      );

【讨论】:

【参考方案2】:

这其实很简单:

  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();
  );

【讨论】:

请详细说明答案。 const stream = require('stream'); 丢失 本例中的 multer in-menory 缓冲区对象在哪里? 远程路径斜杠将被下划线替换,并且不会创建“文件夹”。【参考方案3】:

我们有一个关于更容易支持这个的问题:https://github.com/GoogleCloudPlatform/gcloud-node/issues/1179

但现在,你可以试试:

file.createWriteStream()
  .on('error', function(err) )
  .on('finish', function() )
  .end(fileContents);

【讨论】:

如其他答案中所述,云存储包现在支持.save,这正是您所要求的:googleapis.dev/nodejs/storage/latest/File.html#save【参考方案4】:

以下 sn-p 来自 google 示例。该示例假设您使用了 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);

【讨论】:

getPublicUrl() 函数在哪里【参考方案5】:

我有这种方法对我有用:

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");
     
);

【讨论】:

以上是关于将缓冲区上传到谷歌云存储的主要内容,如果未能解决你的问题,请参考以下文章

如何使用签名的 URL 将文件上传到谷歌云存储桶

春季启动图像上传到谷歌云存储桶不起作用

使用 multer 和 nodejs 将图像上传到谷歌云存储时出错

使用 ajax 通过签名的 url 将文件上传到谷歌云存储

我无法使用 python 脚本将文件上传到谷歌云?

从谷歌云数据存储迁移到谷歌云 sql