#node.js #google-cloud-functions #firebase-storage
#node.js #google-cloud-функции #firebase-хранилище
Вопрос:
Мне успешно удалось создать триггер для облачного хранилища, который изменяет размер и перезаписывает исходный файл изображения.
return destBucket.file(filePath).download({
destination: tempFilePath
}).then(() => {
return spawn('convert', [tempFilePath, '-resize', '150x150', tempFilePath])
}).then(() => {
metadata.isResized = true
return destBucket.upload(tempFilePath,
{
destination: path.join(path.dirname(filePath), path.basename(filePath)),
metadata: { metadata: metadata }
})
}).then(() => fs.unlinkSync(tempFilePath))
});
Однако это также изменяет URL-адрес загрузки для этого файла, который я храню в базе данных firestore
const pathRef = storageRef.ref('profileImg/' uid '/' image.name)
pathRef.put(image).then(() => {
//Get logo URL
const starsRef = storageRef.ref().child('profileImg/' uid '/' image.name)
starsRef.getDownloadURL().then((url) => {
changeProfile({ profile: profile, profileImg: url }).then((result) => {
dispatch(progressSuccess(result))
}).catch((error) => {
dispatch(progressFailed(error.message))
});
}).catch((error) => {
dispatch(progressFailed(error.message))
})
Есть ли какой-либо способ сохранить исходный URL-адрес загрузки в перезаписанном файле? Или есть какой-нибудь способ выполнить эту задачу?
Комментарии:
1. Разве новый путь не является просто старым путем с
-resize
добавлением?2. Привет, Даг. Нет, это совершенно другой путь
3. Привет, codecubed. io на самом деле не все. Просто конец ссылки сразу после носителя и токена носитель и токен = 6ddcd967-4213-47f8-badd-74dbd203e783 носитель и токен =8062018c-738b-4271-9c15-a1a2ce40505c
Ответ №1:
Хорошо, мне пришлось применить другой подход к этой задаче, потому что я предполагаю, что сохранить исходный URL-адрес невозможно. В принципе, теперь я делаю все (изменение размера изображения, удаление исходного изображения, получение URL-адреса, обновление базы данных пользователей) в одной триггерной функции хранилища.
return destBucket.file(filePath).download({
destination: tempFilePath
})
.then(() => {
console.log('The file has been downloaded to', tempFilePath)
return spawn('convert', [tempFilePath, '-resize', '140x140', tempLocalJPEGFile])
}).then(() => {
console.log('JPEG image created at', tempLocalJPEGFile)
metadata.modified = true
return destBucket.upload(tempLocalJPEGFile,
{
destination: JPEGFilePath,
metadata: { metadata: metadata }
})
}).then(() => {
console.log('JPEG image uploaded to Storage at', JPEGFilePath)
return destBucket.file(filePath).delete()
}).then(() => {
console.log('Original file deleted', filePath)
const logo = storageRef.file(JPEGFilePath)
return logo.getSignedUrl({ action: 'read', expires: '03-09-2491' })
}).then((url) => {
const newRef = db.collection("user").doc(uid)
return newRef.set({
profile: {profileImg: url[0]}
}, {
merge: true
})
}).then(()=> {
fs.unlinkSync(tempFilePath);
fs.unlinkSync(tempLocalJPEGFile)
console.log('User database updated')
return null
})
})
Я не уверен, что это лучшая практика, поэтому, пожалуйста, не стесняйтесь комментировать или обновлять. Я также не знал, есть ли лучший способ получить имя папки из корзины, в которой хранится изображение, которое называется значением идентификатора пользователя (userImg/[userIdHere]/image.jpg ), который мне был нужен для обновления базы данных, поэтому я использовал старомодный разделенный код
const uid = filePath.split("/").slice(1,2).join("")
Однако этот триггер сделает корзину доступной только для пользовательских изображений, поскольку мы не можем использовать триггер для определенной папки в корзине