PROFI LEVNĚ (od 2.900 Kč) • Výroba webů a eshopů • Marketingové služby - SEO, PPC • Grafické práce • CSS Kódování • cms Wordpress
Zobrazují se odpovědi 1 až 10 z 10

Vygenerovaný obrázek pro stažení - určení přípony

  1. Zdravíčko.
    Udělal jsem PHP skript, který generuje jeden obrázek. Konkrétně ten skript obsahuje jak část pro vygenerování, tak formulář pro nastavení parametrů.
    Kostra skriptu:
    Kód:
    <?php
    if (isset($_POST) /*a další proměnné*/) {
        $image = imagecreate(...);
        //...
        header('Content-type: image/png');
        imagepng($image);
        exit;
    }?><!doctype html><html>
    <head>...</head>
    <body>
      <form action="" method="post" target="target_form">
        <input ...>
        <input type="submit">
      </form>
      <iframe name="target_form">
      </iframe>
    </body>
    </html>
    S vytvořením obrázku nemám problém, ale chtěl bych - se zachováním této struktury -, aby se dal obrázek uložit z webu na disk se správnou příponou.
    V současné verzi se mi v dialogu pro uložení nabízí přípona PHP a stahuje se zdroják.

    Zkoušel jsem přidat
    Kód:
    header('Content-Transfer-Encoding: binary');
    - bez změny chování.

    Vím o hlavičce "Content-disposition" a hodnotách "attachment", "inline" a dalších - všechny jsem vyzkoušel, bez úspěchu (inline stahuje zdroják, ostatní obrázek rovnou stahují, což nechci).

    Díky za rady.

  2. Co se právě děje na Webtrhu?
  3. ostatní obrázek rovnou stahují, což nechci
    nechapem co tu riesis potom

  4. pokud se ti stahuje zdroják toho php, máš špatně nastavený webový server a nebere php jako program.

    Co používáš a v jaké cestě máš to php?

  5. Chapu dobre, ze jsi dosahl toho, ze prohlizec obrazek automaticky stahuje se spravnou koncovkou, ale pokud se objevi dialogove okno s moznosti ulozeni souboru, tak je soubor s php koncovku?

    Takze to nema stahovat automaticky, ale potrebujes zobrazit dialogove okno?

  6. Tohle by mohlo pomoci
    Kód:
    $filename = "image.png";
    
    header("Content-Type: image/png");
    header("Content-Disposition: inline; filename=\"{$filename}\"")

  7. Citace Původně odeslal node Zobrazit příspěvek
    > ostatní obrázek rovnou stahují, což nechci.

    nechapem co tu riesis potom
    Tím, že ho "rovnou stahují" mám na mysli, že po odeslání formuláře s parametry prohlížeč obrázek nezobrazí (jak bych chtěl), ale rovnou (automaticky) ho začne ukládat na disk. A to nechci - chci, aby se v prohlížeči zobrazil a bylo možno jej z něj případně stáhnout (uložit).

    Citace Původně odeslal TomášX Zobrazit příspěvek
    pokud se ti stahuje zdroják toho php, máš špatně nastavený webový server a nebere php jako program.

    Co používáš a v jaké cestě máš to php?
    Myslíš jakou verzi atd? XAMPP s PHP 7.2.7 na Windows nainstalovaný automatickým spustitelným installerem bez dalších zásahů do configu. A samotný skript je v jednom podadresáři "htdocs", což je hlavní adresář pro projekty. Kdekoli jinde na localhostu pokus stáhnout cíl, kde cíl je PHP, stáhne vygenerované html.

    Spíš bych ale řekl, že to bude tím, že skript generuje jak html s formulářem, tak obrázek.

    Citace Původně odeslal Vít Michalek Zobrazit příspěvek
    Tohle by mohlo pomoci
    Kód:
    $filename = "image.png";
    
    header("Content-Type: image/png");
    header("Content-Disposition: inline; filename=\"{$filename}\"")
    To jsem psal, že jsem zkoušel a že to nefunguje.
    Ale tu hlavičku tam radši nechám.

    ----
    Zjistil jsem, že když zruším generování do iframu (a obrázek se vygeneruje do nového karty prohlížeče), tak z ní už jde stáhnout jako PNG (a to po přidání header("Content-disposition: inline...")). Nebo to vidím na to skipt rozdělit na dva (jeden pouze formulář a druhý pouze pro generování png).

    Asi to nebudu dál zkoumat a nechám to tak. Díky všem. Nicméně, kdyby někdo na to přišel, ať sem klidně napíše řešení.
    Naposledy upravil crs : 07.04.2020 v 20:13

  8. S vytvořením obrázku nemám problém, ale chtěl bych - se zachováním této struktury -, aby se dal obrázek uložit z webu na disk se správnou příponou.
    raz hovoris tak, potom inak :)

    ked pouzijes priklad z php.net tak mas rovnaky vysledok?
    Kód:
    <?php
    $im = imagecreatefrompng("test.png");
    
    header('Content-Type: image/png');
    
    imagepng($im);
    imagedestroy($im);
    ?>
    a ked si zapnes error reporting na all, vypise ti nejake chyby?

  9. Citace Původně odeslal node Zobrazit příspěvek
    a ked si zapnes error reporting na all, vypise ti nejake chyby?
    Ne. Jak jsem psal, s zpracováním problém nemám; obrázek se vygeneruje bez chyb.

    Citace Původně odeslal node Zobrazit příspěvek
    ked pouzijes priklad z php.net tak mas rovnaky vysledok?
    Ano.

  10. No a je problém si zobrazit obrázek přes echo na konci PHP scriptu?


    Celá část kódu (obrázek se zobrazí nad formulářem) pro pochopení:
    Kód:
    <?php
    
        $img = $_FILES['img']['tmp_name'];
        $getMimeType = $_FILES['img']['type'];
        
        if ($img)
        {
        
        $percent = 0.5;
        
        list($width, $height) = getImageSize($img);
        
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        
    
        $thumb = imageCreateTrueColor($newWidth, $newHeight);
        
        if ($getMimeType == 'image/png') {
            $source = imagecreatefrompng($img);
            $mimeType = 'image/png';
            imageCopyResized($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
            ob_start();
            imagepng($thumb);
            $imBytes = ob_get_clean();
        } elseif ($getMimeType == 'image/jpeg') {
            $source = imagecreatefromjpeg($img);
            $mimeType = 'image/jpeg';
            imageCopyResized($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
            ob_start();
            imagejpeg($thumb);
            $imBytes = ob_get_clean();
        } else {
            echo 'Error, this image cannot be used';
            Die();
        }
    
        echo "<img src='data:".$mimeType.";base64," . base64_encode( $imBytes ) . "' />";
        }
    ?>
    
    <!doctype html><html>
    <head></head>
    <body>
      <form action="" method="post" enctype="multipart/form-data">
        <label for="img">Select image:</label>
        <input id="img" type="file" name="img" accept="image/*">
        <input type="submit">
      </form>
    </body>
    </html>

    Celá část kódu (obrázek se zobrazí pod formulářem) pro pochopení:
    Kód:
    <?php
    
        $img = $_FILES['img']['tmp_name'];
        $getMimeType = $_FILES['img']['type'];
        
        if ($img)
        {
        
        $percent = 0.5;
        
        list($width, $height) = getImageSize($img);
        
        $newWidth = $width * $percent;
        $newHeight = $height * $percent;
        
    
        $thumb = imageCreateTrueColor($newWidth, $newHeight);
        
        if ($getMimeType == 'image/png') {
            $source = imagecreatefrompng($img);
            $mimeType = 'image/png';
            imageCopyResized($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
            ob_start();
            imagepng($thumb);
            $imBytes = ob_get_clean();
        } elseif ($getMimeType == 'image/jpeg') {
            $source = imagecreatefromjpeg($img);
            $mimeType = 'image/jpeg';
            imageCopyResized($thumb, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
            ob_start();
            imagejpeg($thumb);
            $imBytes = ob_get_clean();
        } else {
            echo 'Error, this image cannot be used';
            Die();
        }
    
    
        $image_block =  "<img src='data:".$mimeType.";base64," . base64_encode( $imBytes ) . "' />";
        }
    ?>
    
    <!doctype html><html>
    <head></head>
    <body>
      <form action="" method="post" enctype="multipart/form-data">
        <label for="img">Select image:</label>
        <input id="img" type="file" name="img" accept="image/*">
        <input type="submit">
      </form>
      <div style="display:block; padding:15px;">
         <?php echo $image_block ?>
      </div>
    </body>
    </html>
    Naposledy upravil zezmen : 08.04.2020 v 20:11

  11. Citace Původně odeslal zezmen Zobrazit příspěvek
    No a je problém si zobrazit obrázek přes echo na konci PHP scriptu?
    ...
    Není. Díky za nápad, vyzkouším. Tohle řešení bude mít sice větší datový přenos, asi o čtvrtinu, ale mělo by fungovat.

    Btw. V dialogu pro stažení se nabízí jméno "stažený soubor" (v české verzi Chrome, v jiných prohlížečích předpokládám podobně). Je nějaká možnost to změnit na vlastní jméno?
    Koukám, že StackOverflow má nějakou odpověď, ale pro jiný element - zkusím, jestli to půjde i pro <img>.

    ---------- Příspěvek doplněn 09.04.2020 v 07:39 ----------

    Update: Upravil jsem to a konečně lze obrázek uložit jako PNGčko. Název souboru se stále nabízí jako "stažený soubor", parametr name (dle rady na StackOverflow) nepomohl. Ale můžu obrázek obalit do
    Kód:
    <a href="#" download="muj-nazev.png"><img src="..."></a>
    a potom (alespoň v Chromu) se nabízí specifikované jméno.

    ----
    Citace Původně odeslal zezmen Zobrazit příspěvek
    Celá část kódu (...) pro pochopení:
    Ten kód jsi psal ty? Teprve teď jsem se na to podíval a vypadá to, že jsou v něm chyby:
    • v prvním příkladu je chyba vypisovat nejdřív <img> a pak až <!doctype html><html><body> atd. U některých prohlížečů by to mohlo způsobit špatnou identifikaci <!doctype>, který předpokládají jako první věc ve výstupu html, a s tím spojené problémy.
    • ob_end_clean() nevrací obsah bufferingu ale true/false podle úspěšnosti. Na vrácení bufferovaného obsahu je ob_get_contents() (který se musí zavolat před ob_end_clean()).
    Ale nechci vyznít jako rýpal - takže ještě jednou díky za navedení správným směrem.

Spolupracujeme: Jooble.org, Aximum - profesionální překlady Hostujeme u Server powered by TELE3