[英]Sending multiple files to GCS in Node
因此,我需要更改Google Cloud Storage中的此功能,以便它可以上传多个文件,而不是一个。 我正在尝试找到一个好的解决方案,使其始终等到所有文件上传完毕。 不知道如何使其异步-我应该在stream.on('finish',(...))
还是file.makePublic().then(...)
上file.makePublic().then(...)
这绝对是我可以收集的Promiste与Promise.all()
,然后解决next()
。
或者,如果已经有了Google未在其文档中披露的解决方案,那就更好了。
功能:
function sendUploadsToGCS (req, res, next) {
if (!req.files) {
return next()
}
let vals = Object.values(req.files)
for(let f of vals){
const gcsname = Date.now() + f[0].originalname
const file = bucket.file(gcsname)
const stream = file.createWriteStream({
metadata: {
contentType: f[0].mimetype
},
resumable: false
})
stream.on('error', (err) => {
f[0].cloudStorageError = err
next(err)
})
stream.on('finish', () => {
f[0].cloudStorageObject = gcsname;
file.makePublic().then(() => {
f[0].cloudStoragePublicUrl = getPublicUrl(gcsname)
console.log('pub url: ', getPublicUrl(gcsname))
next()
})
})
stream.end(f[0].buffer)
}
}
原始功能(针对一个文件): https : //cloud.google.com/nodejs/getting-started/using-cloud-storage#upload_to_cloud_storage
这是我如何解决的:
function sendUploadsToGCS (req, res, next) {
if (!req.files) {
return next()
}
let promises = []
let vals = Object.values(req.files)
for(let f of vals){
const gcsname = Date.now() + f[0].originalname
const file = bucket.file(gcsname)
const stream = file.createWriteStream({
metadata: {
contentType: f[0].mimetype
},
resumable: false
})
stream.on('error', (err) => {
f[0].cloudStorageError = err
next(err)
})
stream.end(f[0].buffer)
promises.push(
new Promise ((resolve, reject) => {
stream.on('finish', () => {
f[0].cloudStorageObject = gcsname;
file.makePublic().then(() => {
f[0].cloudStoragePublicUrl = getPublicUrl(gcsname)
resolve()
})
})
})
)
}
Promise.all(promises).then(() => next())
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.