У меня ранее была настроена и работала загрузка одного файла.Теперь мне нужно, чтобы он обрабатывал несколько файлов.
Вот мой код прямо сейчас:
const multer = require('multer')
const { Storage } = require('@google-cloud/storage')
const storage = new Storage()
const m = multer({ storage: multer.memoryStorage() })
module.exports = app => {
app.use('/', router)
router.post(
'/reader-:shortId/file-upload',
passport.authenticate('jwt', { session: false }),
m.array('files'),
async function (req, res) {
const bucketName = req.params.shortId.toLowerCase()
await storage.createBucket(bucketName)
bucket = storage.bucket(bucketName)
let promises = []
req.files.forEach((file) => {
const blob = bucket.file(file.originalname)
const newPromise = new Promise((resolve, reject) => {
blob.createWriteStream({
metadata: { contentType: file.mimetype }
}).on('finish', async response => {
await blob.makePublic()
resolve(response)
}).on('error', err => {
reject('upload error: ', err)
}).end()
})
promises.push(newPromise)
})
Promise.all(promises).then((response) => {
// the response I get here is [undefined, undefined]
res.status(200).send(response)
}).catch((err) => {
res.status(400).send(err.message)
});
})
}
req.files дает мне массив файлов с буфером и размером, который имеет смысл.Обещания все решают.Но как только я проверяю файлы в Google Bucket, они имеют правильное имя, но не имеют никакого содержимого (и размер 0)
Как я уже говорил, это работало, когда я делал это с однимфайл (используя m.single ('file')
Я не хочу использовать корзину в качестве места назначения с настройкой мультитера, потому что мне также нужно изменить имя файла перед загрузкой в корзину Google.
edit: это пример кода, предоставленный облачной документацией Google для загрузки отдельных файлов (https://cloud.google.com/nodejs/getting-started/using-cloud-storage):
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);
}
У меня изначально было что-то подобное, но я просто не понимаюоткуда он получает данные файлового буфера. Вероятно, там, где разные файлы различны.