1

所以开发这个应用程序是使用firebase firestore和firebase storage的nodejs。
我想要做的是,我已经在 Firebase 存储中有几个图像。我会随机下载一张图片并对其执行 stego。为此,我需要先下载图像,以便执行隐秘操作。

此外,我的 firebase 应用程序被初始化为const firebaseApp = firebase.initializeApp(firebaseConfig);

我的 get_image() 代码如下:

// This has to be async because I need to use await for firebase accesses. 
async function get_image() {

    const ref = storage.ref('sauce_png_pics');
    const all_images = await ref.listAll();
    // console.log();
    const img_num = Math.floor(Math.random() * all_images.items.length);
    var request; 
    var img_base64;
    var img_data = "";

    const img_url = await all_images.items[img_num].getDownloadURL();
    request =  https.request(img_url, (response) => {
        console.log("Auto Download stared");
        response.on('data', (chunk) => {
            img_data += chunk;
        }).on('end', () => {
            console.log("Auto Image downloaded");
            console.log(img_data);
            return Buffer.from(img_data, 'binary').toString('base64');
        });
    });
}

我还尝试使用 XMLHTTPRequest 下载图像:

async function get_image() {
    const ref = storage.ref('sauce_png_pics');
    const all_images = await ref.listAll();
    // console.log();
    const img_num = Math.floor(Math.random() * all_images.items.length);

    const img_url = await all_images.items[img_num].getDownloadURL();
    const xhr = new XMLHttpRequest();
    xhr.responseType = 'text';
    console.log(xhr);
    xhr.open('GET', img_url);
    // xhr.send();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == XMLHttpRequest.DONE);
            console.log(xhr.status);
            if (xhr.status === 0 || xhr.status >=200) {
                console.log(xhr.responseText);
                return xhr.responseText;
            }

    };
    xhr.send();
}

稍后在 main 函数中,我会:

var img = await get_image();
var png = PNG.sync.read(Buffer.from(img);

我的问题是,当我运行此代码时,出现错误:

Error: There are some read requests waitng on finished stream
    at push../node_modules/pngjs/lib/sync-reader.js.module.exports.push../node_modules/pngjs/lib/sync-reader.js.SyncReader.process (sync-reader.js:39)
    at push../node_modules/pngjs/lib/parser-sync.js.module.exports (parser-sync.js:68)
    at Object.push../node_modules/pngjs/lib/png-sync.js.exports.read (png-sync.js:7)
    at stego (lsbtools.js:59)
    at async onSubmit (SendMail.js:54)
    at :3000/async http:/localhost:3000/static/js/vendors~main.chunk.js:396829

这是因为 await get_image() 并没有真正在等待。(lsbtools.js 行:59)
问题是我只调用一次 get_image()!但在控制台中,我可以看到img_data记录了3-4 次!!这很奇怪!. 对于异步,我正在使用等待,但它并不是真的在等待!

IDK这里有什么问题。我的逻辑是否错误或firebase下载以我不知道的不同方式工作!我已经尝试删除 get_image() 代码并直接在代码中使用它而没有任何函数调用仍然没有运气!

我的主要目标是确保以 RAW 格式下载图像,传递给 PNG.sync.read,然后将其传递给 stego 函数以隐藏一些数据。我首先无法下载图像!图像大小约为 326KB,我的互联网连接良好。

任何帮助表示赞赏!提前致谢

4

0 回答 0