将图像保存到Firebase存储桶中没有对链接的身份验证

时间:2018-09-08 23:32:14

标签: firebase google-cloud-functions firebase-storage

我目前将图像保存为Firebase数据库中的url,但是我需要将其转换为Firebase存储桶中的已保存图像。我获取URL,将其保存到Firebase存储中,然后将图像节点替换为Firebase存储链接的新URL,然后将其放置在img标签中。

const functions = require('firebase-functions');

const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

const bucket = admin.storage().bucket();
const request = require('request');

exports.saveToStorage = functions.database.ref(`/events/{eventID}`)
    .onCreate(snapshot => {

    const firebaseUrl = `https://firebasestorage.googleapis.com/v0/b/${FIREBASE_ID}.appspot.com/o/`;
    const filePath = snapshot.val().image;
    const fileKey = snapshot.key;
    const filename = filePath.split('/').pop();
    const firebasePath = firebaseUrl+filename;

    const remoteWriteStream = bucket.file(filename).createWriteStream({
        metadata: { contentType: 'image/jpeg' }
    });

    request(filePath).pipe(remoteWriteStream)
        .on('error', (err) => console.log(err))
        .on('finish', () => {
            console.log("Image saved successfully");
            //replace old image with new image path saved in firebase storage
            return snapshot.ref.parent.child(fileKey+'/image').set(firebasePath);
        });
});

当前问题是一切似乎都正常,但是获得的链接似乎没有经过验证,并且无法从通过此方法获得的链接中查看图像。

这可以通过这种方式完成吗?还是我需要将图像从url转换为二进制数据,然后上传到Firebase存储桶?

1 个答案:

答案 0 :(得分:1)

您不应尝试手动构建下载URL。这些URL由Cloud Storage生成。您不能简单地发明自己的一个。

如果您需要为添加到Cloud Storage的文件生成URL,则需要使用提供的API在客户端或服务器上执行该操作。

您可以通过generating a download url在客户端上生成下载URL(链接的说明适用于Web,但是您可以在任何客户端平台上执行此操作)。

您可以通过使用Cloud Storage节点SDK(方法为signed url)生成getSignedUrl来在服务器上生成下载URL。