【问题标题】: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 存储似乎不可行。是否有任何解决方法/上传缓冲区的方法?

【问题讨论】:

    标签: node.js google-app-engine gcloud gcloud-node


    【解决方案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);
      

      【讨论】:

      【解决方案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");
           }
      });
      

      【讨论】:

        猜你喜欢
        • 2018-09-05
        • 1970-01-01
        • 2021-11-02
        • 2021-06-15
        • 1970-01-01
        • 2021-06-09
        • 2015-02-28
        • 2017-12-06
        • 1970-01-01
        相关资源
        最近更新 更多