Есть ли СИНХРОННАЯ загрузка изображения из хранилища FIREBASE? И передать его в PNG.sync.read?

Таким образом, разработка этого приложения — это nodejs, который использует firebase firestore и firebase storage.
Что я пытаюсь сделать, так это то, что у меня уже есть пара изображений в хранилище Firebase. Я бы случайным образом загрузил изображение и выполнил на нем стего. Для этой цели мне нужно, чтобы изображение было загружено первым , чтобы я мог выполнять стеганографические операции.

Кроме того, мое приложение 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();
}

Позже в основной функции я делаю:

      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() только один раз !! но в консоли я это вижу логируется 3-4 раза!! Что странно!! . Для асинхронности я использую ожидание, но на самом деле это не ожидание!

ИДК, что здесь не так. Является ли моя логика неправильной или загрузка firebase работает по-другому, о чем я не знаю! Я попытался удалить код get_image() и напрямую использовать его в коде без какого-либо вызова функции, но все равно не повезло!

Моя главная цель — убедиться, что изображение загружается в формате RAW, передается в PNG.sync.read, который позже передается стего-функции, чтобы скрыть некоторые данные. Я не могу загрузить изображение в первую очередь! Размер изображения составляет около 326 КБ, и у меня есть приличное подключение к Интернету.

Любая помощь приветствуется! заранее спасибо

0 ответов

Другие вопросы по тегам