URL-адрес из getSignedUrl истекает через несколько недель - PullRequest
1 голос
/ 25 мая 2019

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

    }).then(() => {
        console.log('Original file deleted', filePath)
        const logo = storageRef.file(JPEGFilePath)
        return logo.getSignedUrl({ action: 'read', expires: date })

        // const logo = storageRef.child(JPEGFilePath)
        // return logo.getDownloadURL()

        // return storageUrl.getDownloadURL(JPEGFilePath)
    }).then((url) => {
        const newRef = db.collection("user").doc(uid)
        return newRef.set({
            profile: { profileImg: url[0] }
        }, {
                merge: true
            })
    })

вот как я устанавливаю срок годности

const d = new Date()
const date = new Date(d.setFullYear(d.getFullYear() + 200)).toString()

Однако срок действия изображения истекает через несколько недель (примерно около 2 недель). Кто-нибудь знает, как это исправить? Я даже играл с getDownloadURL, как вы можете видеть из закомментированного кода, но это не работает в триггере

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Хорошо, я попробовал кое-что, но я понятия не имею, сработает ли это, или нет, поэтому я вернусь через 2 недели, чтобы пометить мой вопрос как ответивший, если это сработает. Для тех, у кого такая же проблема, я постараюсь повторить то, что я сделал.

1 / Загрузите ключ учетной записи службы из консоли. Вот ссылка

https://console.firebase.google.com/project/_/settings/serviceaccounts/adminsdk

2 / Сохранить загруженный файл JSON в каталоге функций

3 / Включите ключ в хранилище функций. Но будьте осторожны, когда вы устанавливаете путь к файлу. Вот мой вопрос по этому поводу

https://stackoverflow.com/a/56407592/11486115

UPDATE

Я только что нашел ошибку в своей функции. Мой URL был предоставлен облачной функцией по ошибке (закомментированный код)

Вот полная функция

const {
db
} = require('../../admin')


const projectId = "YOUR-PROJECT-ID"
const { Storage } = require('@google-cloud/storage');
const storage = new Storage({ projectId: projectId ,keyFilename: 'PATH-TO-SERVICE-ACCOUNT'})

const os = require('os');
const fs = require('fs');
const path = require('path');

const spawn = require('child-process-promise').spawn

const JPEG_EXTENSION = '.jpg'

exports.handler = ((object) => {
const bucket = object.bucket;
const contentType = object.contentType;
const filePath = object.name
const JPEGFilePath = path.normalize(path.format({ dir: path.dirname(filePath), name: 'profileImg', ext: JPEG_EXTENSION }))
const destBucket = storage.bucket(bucket)
const tempFilePath = path.join(os.tmpdir(), path.basename(filePath))
const tempLocalJPEGFile = path.join(os.tmpdir(), path.basename(JPEGFilePath))
const metadata = {
    contentType: contentType
}
const uid = filePath.split("/").slice(1, 2).join("")
const d = new Date()
const date = new Date(d.setFullYear(d.getFullYear() + 200)).toString()

if (!object.contentType.startsWith('image/')) {
    return destBucket.file(filePath).delete().then(() => {
        console.log('File is not an image ', filePath, ' DELETED')
        return null
    });
}

if (object.metadata.modified) {
    console.log('Image processed')
    return null
}

return destBucket.file(filePath).download({
    destination: tempFilePath
})
    .then(() => {
        console.log('The file has been downloaded to', tempFilePath)
        return spawn('convert', [tempFilePath, '-resize', '100x100', 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)
        const logo = destBucket.file(JPEGFilePath)
        return logo.getSignedUrl({ action: 'read', expires: date })
    }).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(uid, 'user database updated ')
        return null
    })
})

Я довольно уверен, что теперь это будет работать.

1 голос
/ 25 мая 2019

По следующим ссылкам:

https://stackoverflow.com/a/42959262/370321

https://cloud.google.com/nodejs/docs/reference/storage/2.5.x/File#getSignedPolicy

Не уверен, какую версию @ google / cloud-storage вы используете, но при условии, что это 2.5.x, похоже, что любое значение, которое вы передаете в поле даты, передается в новую функцию Date (), поэтому она выглядит как ваша код должен работать так, как я пробовал в моих инструментах разработки. Единственное, что я могу догадаться, это то, что вам не нужно, чтобы файл просуществовал 200 лет.

По исходному коду:

https://github.com/googleapis/nodejs-storage/blob/master/src/file.ts#L2358

Вы пытались сократить время или отформатировать его в формате даты в мм-дд-гггг?

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