Zobrazení base64 img net::ERR_INVALID_URL

mimacala
Člen | 113
+
0
-

Ahojte, už delší dobu bojuji s QR kódy.
Používám z composeru https://qrcode-library.readthedocs.io/en/latest/.

Dle dokumentace používám funkci „$qrCode->writeDataUri()“, která vytvoří kompletní src base64 pro obrázek a poté mi tuto cestu uloží do databáze.

Zde ukládám QR do db

public function handleGenerateQR($idurl): void
    {

        $urlky = $this->url->ReturnUserUrls($this->user->getIdentity()->email); // uživatele urls
        foreach ($urlky as $url)
        {
            if($url->id == $idurl) // pokud  url kterou vlastní přihlášený uživatel
            {
                $qrCode = $this->qr = (new QrCode($url->shorturl))
                    ->setSize(250)
                    ->setMargin(5)
                    ->setEncoding('UTF-8');

                $update = $this->url->UpdateUrls($url->id,["qrcode" => $qrCode->writeDataUri()]);

                if($this->url->UpdateUrls($url->id,["qr" => "1"]))
                {
                    $this->flashMessage('qr has been generated', "success");
                    $this->redirect("this");
                } else {
                    $this->flashMessage('Something went wrong', "error");
                    $this->redirect("this");
                }



            }
        }
        $this->flashMessage('Something went wrong1', "error");
        $this->redirect("this", );

    }

Zde potom výpis z db zobrazuji v šabloně. Ve zdrojovém kódu to vyhodí

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQQAAAEECAIAAABBat1dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEO0lEQVR4nO3dS47bMBBAwXGQ+195snkrLYQIFE3KrtoFSPwZ+4HAdFp6/f7+/gA/P39WvwDYhRggYoCIAfL38OfX67Xkdcwz8huC85/Gqt89rHpVH//dcDJAxAARA0QMEDFAxAARA0QMEDFAjhPoc3v+f++Ry" />
{foreach $urls as $url}
                                    <tr>
                                        <th scope="row">{$url->longurl}</th>
                                        <td>{$url->shorturl}</td>

                                        <td><img src="{$url->qrcode|nocheck}" /></td>

                                    </tr>
                                {/foreach}
  public function renderQr(int $page = 1)
    {
        $this->setLayout('User'); // nastaví layout na home
        //vrátí url adresy uživatele
        $urlky = $this->url->ReturnUserUrls($this->user->getIdentity()->email);
        $lastPage = 0;
        $this->template->urls = $urlky->page($page,5,$lastPage);
        $this->template->page = $page;
        $this->template->lastPage = $lastPage;
        //vrátí doménu serveru
        $this->template->domain = $this->ReturnDomain();
        //vrátí brand
        $this->template->brand = $this->setting->ReturnBrand();
        //vrátí email do šablony
        $this->template->name = $this->user->getIdentity()->email;

    }

Místo obrázku se ale zobrazuje bílé okénko a v konzoli to vypisuje net::ERR_INVALID_URL.
S tím to jsem se ještě nesetkal tam moc nevím jak to řešit ?
Generuje knihovna špatně base64 kód ? Je něco špatně při předání do latte ?
Pokud využiji jinou funkci knihovy třeba pro qr v novém okně, tak normálně funguje, tedy usuzuji, že v base64 problém nebude.

Moc děkuji za váš čas a případné rady.

Ozzrel
Generous Backer | 51
+
+1
-

Tak zkus ten base64 tady tuším že to nefunguje s tím co posíláš ty.

nightfish
Člen | 474
+
+3
-

@mimacala Podle mě jsou ta base64-encoded data příliš krátká na to, aby obsahovala rozumný PNG soubor. Co jsem si zkoušel pár generátorů QR kódů pro URL, tak výsledné PNG mělo kolem 2 kB – tvoje má 233 B. Nemáš náhodou sloupeček v databázi s omezenou velikostí (např. varchar(255))?

mimacala
Člen | 113
+
0
-

Ano mám tam varchar 255.
Prosím co bych tam měl nastavit jinak ?

Editoval mimacala (21. 6. 2023 15:19)

Marek Bartoš
Nette Blogger | 1177
+
+1
-

Dej si tam typ mediumtext a budeš ok :)
Btw, v mysql to číslo v závorce reálně nedělá vůbec nic důležitého.

nightfish
Člen | 474
+
+1
-

@mimacala Mohl by fungovat typ text (podporovaná velikost 65 kB) nebo mediumtext (podporovaná velikost 16 MB).

mimacala
Člen | 113
+
0
-

No …
Opravdu všem posílám +1, protože já hledal problém všude možně, ale velikost db mě nenapadla.
Klobouk dolů a velké díky.

m.brecher
Generous Backer | 762
+
+4
-

@mimacala

Dle dokumentace používám funkci „$qrCode->writeDataUri()“, která vytvoří kompletní src base64 pro obrázek a poté mi tuto cestu uloží do databáze.

Ještě než data kódovaná QR kódem uložíš do databáze je dobré se zamyslet nad tím, kolikrát se tato data budou zobrazovat. QR kódy jsou obvykle použité pro přenos dat z jedné aplikace do druhé přes nějakou čtečku. A při takovémto přenosu je typické jedno jediné čtení na jeden QR kód. Takže třeba vygeneruješ QR kód do faktury a faktura je někam odeslaná. Příjemce si fakturu jednou načte QR čtečkou a dál už se QR kód nepoužívá. V QR kódu jsou typicky kódovaná data uložená v databázi. Uložením QR kódu do databáze se DUPLIKUJÍ databázová data, což je v rozporu s principy normalizace dat. Duplikace má smysl např. z výkonnostních důvodů. Pokud se generování jednoho QR kódu v aplikaci bude pohybovat v řádu jednotek/nižších desítek opakování, tak bych QR kód do databáze vůbec neukládal a rovnou bych ho vykreslil do html.

Já mám třeba aplikaci, kde se na jedné html stránce tiskne cca 50 QR kódů na nálepky. Generuji QR kódy dynamicky rovnou do stránky base64 a běhá to na výbornou.

Editoval m.brecher (21. 6. 2023 16:02)

Kamil Valenta
Člen | 762
+
0
-

Marek Bartoš napsal(a):

Btw, v mysql to číslo v závorce reálně nedělá vůbec nic důležitého.

To možná zbytečně trochu klame. Platí to jen do chvíle, než nad tím varcharem bude potřeba index.