如何在Firebase函数中从Firebase存储中获取图像的尺寸?

时间:2019-05-30 01:41:19

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

我有一个具有Firebase后端的应用程序。当我制作图像时,我并没有考虑图像的尺寸,好像它们将来会有用,所以我只是将图像保持原样并将其URL保留在firestore中。

但是现在我需要图像的尺寸,然后再向用户展示,所以我想到了只执行一次的功能,以便在Firestore中设置其尺寸的文件,并且还会添加一些客户端代码,以便在上传尺寸之前获取尺寸。

所以我已经尝试了几乎所有方法来获取函数中的文件尺寸,但是无法做到。

样本[抽象代码]

此代码在node.js中有效,但在firebase函数中失败

    const fs = require('fs')
    const request = require('request')
    import sizeOf from 'image-size'
    const FIRE = 'https://firebasestorage.googleapis.com/file....'
    const FILE = 'file.jpg';

    request.head(FIRE, (err, res, body) => {
        request(FIRE)
            .pipe(fs.createWriteStream(FILE))
            .on('close', () => {
                sizeOf(FILE, (err1, dimensions) => {
                    const result = {
                        "width": dimensions.width,
                        "height": dimensions.height
                    }
                    console.log(dimensions.width, dimensions.height);
                    fs.unlinkSync(FILE);
                    response.setHeader('Content-Type', 'application/json');
                    const responseData = {
                        'Error': false,
                        'Message': "result : " + result
                    };
                    response.send(JSON.stringify(responseData));
                })
            })
    })

如果有人对此有所了解,请帮助我!

而且还告诉我有关Firebase如何保存图像的信息,我的意思是?每当我打开url时,它都不会向我显示图片,而是只会在随机网站上下载该图片并取消其他url的显示。

我有一个窍门。它很容易出错,但是可以肯定地工作:

使用api获取图像的所有网址,并使用node.js在本地进行处理,然后将结果发布到另一个api,然后将其提供给firestore?

1 个答案:

答案 0 :(得分:1)

您的代码正在尝试写入:

const FILE = 'file.jpg';

index.js存储位置相同的目录中的文件。这(如错误消息所述)是Cloud Functions容器中的只读目录。如果要写入任何文件,它们必须位于/tmp(也称为tempfs)中。参见Write temporary files from Google Cloud Function