web-dev-qa-db-ja.com

Googleクラウドストレージへのバッファのアップロード

(フォームからアップロードされたファイルの)バッファを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ストレージを使用するのは実行不可能と思われます。バッファをアップロードするための回避策/方法はありますか?

15
Ashley B

これをより簡単にサポートすることについて問題があります: https://github.com/GoogleCloudPlatform/gcloud-node/issues/1179

しかし今のところ、あなたは試すことができます:

file.createWriteStream()
  .on('error', function(err) {})
  .on('finish', function() {})
  .end(fileContents);
7
Stephen

これは実際には簡単です。

  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();
  });
6
Hoovinator

次のスニペットは、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);
}
3
Geige V