将缓冲区上传到 google 云存储
Uploading a buffer to google cloud storage
我正在尝试将(从表单上传的文件的)缓冲区保存到 Google 云存储,但 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);
}
.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);
}
});
我有这种方法:
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");
}
});
我正在尝试将(从表单上传的文件的)缓冲区保存到 Google 云存储,但 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);
}
.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);
}
});
我有这种方法:
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");
}
});