(フォームからアップロードされたファイルの)バッファを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ストレージを使用するのは実行不可能と思われます。バッファをアップロードするための回避策/方法はありますか?
これをより簡単にサポートすることについて問題があります: https://github.com/GoogleCloudPlatform/gcloud-node/issues/1179
しかし今のところ、あなたは試すことができます:
file.createWriteStream()
.on('error', function(err) {})
.on('finish', function() {})
.end(fileContents);
これは実際には簡単です。
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();
});
次のスニペットは、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);
}