将 Google 云函数中的图像上传到云存储
Upload Image from Google Cloud Function to Cloud Storage
我正在尝试使用 Google 云函数处理文件上传。此函数使用 Busboy 解析多部分表单数据,然后上传到 Google Cloud Storage。
我一直收到同样的错误:ERROR: { Error: ENOENT: no such file or directory, open '/tmp/xxx.png'
触发函数时出错。
当 storage.bucket.upload(file) 尝试打开文件路径 /tmp/xxx.png
.
时,错误似乎发生在 finish
回调函数中
请注意,我无法按照 this question 中的建议生成签名上传 URL,因为调用它的应用程序是外部非用户应用程序。我也无法直接上传到 GCS,因为我需要根据一些请求元数据制作自定义文件名。我应该只使用 Google App Engine 吗?
函数代码:
const path = require('path');
const os = require('os');
const fs = require('fs');
const Busboy = require('busboy');
const Storage = require('@google-cloud/storage');
const _ = require('lodash');
const projectId = 'xxx';
const bucketName = 'xxx';
const storage = new Storage({
projectId: projectId,
});
exports.uploadFile = (req, res) => {
if (req.method === 'POST') {
const busboy = new Busboy({ headers: req.headers });
const uploads = []
const tmpdir = os.tmpdir();
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const filepath = path.join(tmpdir, filename)
var obj = {
path: filepath,
name: filename
}
uploads.push(obj);
var writeStream = fs.createWriteStream(obj.path);
file.pipe(writeStream);
});
busboy.on('finish', () => {
_.forEach(uploads, function(file) {
storage
.bucket(bucketName)
.upload(file.path, {name: file.name})
.then(() => {
console.log(`${file.name} uploaded to ${bucketName}.`);
})
.catch(err => {
console.error('ERROR:', err);
});
fs.unlinkSync(file.path);
})
res.end()
});
busboy.end(req.rawBody);
} else {
res.status(405).end();
}
}
我最终放弃了使用 Busboy。 Google Cloud Functions 的最新版本同时支持 Python 和节点 8。在节点 8 中,我只是将所有内容都放入 async/await 函数中,它工作正常。
我正在尝试使用 Google 云函数处理文件上传。此函数使用 Busboy 解析多部分表单数据,然后上传到 Google Cloud Storage。
我一直收到同样的错误:ERROR: { Error: ENOENT: no such file or directory, open '/tmp/xxx.png'
触发函数时出错。
当 storage.bucket.upload(file) 尝试打开文件路径 /tmp/xxx.png
.
finish
回调函数中
请注意,我无法按照 this question 中的建议生成签名上传 URL,因为调用它的应用程序是外部非用户应用程序。我也无法直接上传到 GCS,因为我需要根据一些请求元数据制作自定义文件名。我应该只使用 Google App Engine 吗?
函数代码:
const path = require('path');
const os = require('os');
const fs = require('fs');
const Busboy = require('busboy');
const Storage = require('@google-cloud/storage');
const _ = require('lodash');
const projectId = 'xxx';
const bucketName = 'xxx';
const storage = new Storage({
projectId: projectId,
});
exports.uploadFile = (req, res) => {
if (req.method === 'POST') {
const busboy = new Busboy({ headers: req.headers });
const uploads = []
const tmpdir = os.tmpdir();
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const filepath = path.join(tmpdir, filename)
var obj = {
path: filepath,
name: filename
}
uploads.push(obj);
var writeStream = fs.createWriteStream(obj.path);
file.pipe(writeStream);
});
busboy.on('finish', () => {
_.forEach(uploads, function(file) {
storage
.bucket(bucketName)
.upload(file.path, {name: file.name})
.then(() => {
console.log(`${file.name} uploaded to ${bucketName}.`);
})
.catch(err => {
console.error('ERROR:', err);
});
fs.unlinkSync(file.path);
})
res.end()
});
busboy.end(req.rawBody);
} else {
res.status(405).end();
}
}
我最终放弃了使用 Busboy。 Google Cloud Functions 的最新版本同时支持 Python 和节点 8。在节点 8 中,我只是将所有内容都放入 async/await 函数中,它工作正常。