Изменение URL загрузки, когда файл перезаписывается в корзину.Как сохранить оригинальный URL - PullRequest
0 голосов
/ 15 апреля 2019

Мне удалось создать триггер для облачного хранилища, который изменяет размеры и перезаписывает исходный файл изображения.

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 Ответ

0 голосов
/ 18 апреля 2019

Хорошо. Мне пришлось применить другой подход к этой задаче, потому что я предполагаю, что нет способа сохранить исходный 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("")

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

...