Изменение URL-адреса загрузки при перезаписи файла в корзине. Как сохранить исходный URL

#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("")
  

Однако этот триггер сделает корзину доступной только для пользовательских изображений, поскольку мы не можем использовать триггер для определенной папки в корзине