Nahráváme na server
12.04.2008Komentáře (11) Kategorie: Tvorba webu » PHP

Jak jsem v minulém díle slíbil, ukážeme si, jak nahrajeme fotku na server už s vloženým vodoznakem. Rozhodně existují jednodušší způsoby jak nahrát soubory na server, třeba přes funkci copy(); move_uploaded_fi­le(); nebo přes script s využitím FTP, ale o tom zase jindy. Nyní se budeme věnovat nahrávání fotky, do které vložíme vodoznak.

Nejdříve si vytvoříme formulář, který nám soubor odešle. Aby odeslal soubor, nesmíme do něj přidat enctype=„multi­part/form-data“. Prázdnou hodnotou u parametru action="" scriptu řekeme, že má data odesílat sám sobě. Dále budeme potřebovat zjistit cestu z rootu webu, kterou má každý jinou. Aby nám náš script fungoval, musíme mít ještě vytvořený vodoznak ve formátu PNG, o kterém jsem se již zmiňoval v minulém díle.

Nyní si pojďmě vytvořit soubor, do kterého vložíme tento formulář:


<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>

  <form action="" method="post" enctype="multipart/form-data">
 
  <input type="file" name="fotka" />
  <input type="submit" name="odesli" value="Nahrát soubor" />
 
  </form>
 
  </body>
</html>
 

Před formulář budeme psát script. Nejdřív ověříme, jestli je vůbec formulář odeslaný. V případě že není (takový případ nastane když jdete na stránku poprvé) se nic neprovede. Další podmínkou zajistíme, aby byl nahrávaný soubor typu JPEG.


<?php
/* pokud je formulář odeslán a obsahuje nahranou fotku */
if(isset($_POST["odesli"]) && isset($_FILES["fotka"]))
{
  if($_FILES["fotka"]["type"] == "image/jpeg" ||
  $_FILES["fotka"]["type"] == "image/pjpeg")
  {
     
  // zpracování scriptu
     
  }
  else
  {
  echo "Fotka musí být ve formátu JPEG";
  }  
}
?>
 

Fotka ve formuláři se nám nahraje do superglobálního asociativního dvourozměrného pole $_FILES, kde první index je název <input name=„název“> a druhých parametrů je o něco více… Ukážeme si ty nejdůležitější:


<?php
$_FILES["fotka"]["name"]; /* původní název fotky v počítači */
$_FILES["fotka"]["tmp_name"]; /* název fotky v dočasném adresáři (v Temporary files) */
$_FILES["fotka"]["type"]; /* typ nahrávaného souboru, u JPG fotky je to image/jpeg nebo image/pjpeg */
$_FILES["fotka"]["size"]; /* velikost fotky */
?>
 

To jen pro ukázku. Nyní použijeme script z minulého příkladu s jedinou změnou. Ve funkci imageJpeg(); jako druhý parametr uvedeme proměnnou $root, ve které je uložená cesta z rootu webu a název souboru. Tím uvedeme kam a jak se má soubor uložit.


<?php    
/* Průběh scriptu - vložení vodoznaku a uložení na server */
       
$size_fotka = getImageSize($fotka); /* zjistí velikost fotky */
$size_vdz = getImageSize($vdz); /* zjistí velikost vodoznaku */
       
$new = imageCreateTrueColor($size_fotka[0],$size_fotka[1]); // vytvoří nové černé plátno o rozměrech fotografie
$image = imageCreateFromJpeg($fotka); /* načte do proměnné fotografii */
$copy = imageCreateFromPng($vdz); /* načte do proměnné vodoznak */
       
$dst_x = $size_fotka[0] - $size_vdz[0]; /* vypočítá souřadnice umístění vodoznaku */
$dst_y = $size_fotka[1] - $size_vdz[1]; /* vypočítá souřadnice umístění vodoznaku */
       
imageCopyResized($new, $image, 0, 0, 0, 0, $size_fotka[0], $size_fotka[1], $size_fotka[0], $size_fotka[1]); /* vloží obrázek do plátna; */
imageCopyResized($new, $copy, $dst_x, $dst_y, 0, 0, $size_vdz[0], $size_vdz[1], $size_vdz[0], $size_vdz[1]); /* vloží obrázek do plátna; */
       
$save = imageJpeg($new, $root, 70); /* Uloží obrázek na adresu $root se 70% kvalitou */
       
imageDestroy($new); // zruší mezipamět obrázku
imageDestroy($image); // zruší mezipamět obrázku
imageDestroy($copy); // zruší mezipamět obrázku
?>
 

V proměnné $save nyní máme výsledek uložení na server. Tudíž si můžeme vypsat, zda nahrání proběhlo úspěšně, či nikoliv.


if($save) echo "Fotografie byla úspěšně uložena";
else echo "Fotografii se nepodařilo nahrát na server!";
 

Tento script nám nahraje fotky na server už s vodoznakem, tudíž se nikdo nedostane k originálům bez vodoznaku, oproti předchozímu příkladu, kde fotky byly na serveru uloženy bez něj, a zobrazovaly se přes script. Fotky se nahrávají v originální velisti, což se někdy nemusí hodit, zejména pokud vytváříte fotogalerii a chcete mít všechny fotky ve stejné velikosti. V tomto případě Vám jistě poslouží článek o hromadném zmenšování. V příštím díle bych se chtěl věnovat jak nahrát na server jakýkoliv soubor, a možnostem, které toto nahrávání nabízí. Nakonec ještě uvedu celý script, který jsme dnes vytvořili:


<?php
   
    /* pokud je formulář odeslán a obsahuje nahranou fotku */
    if(isset($_POST["odesli"]) && isset($_FILES["fotka"]))
    {
      if($_FILES["fotka"]["type"] == "image/jpeg" || $_FILES["fotka"]["type"] == "image/pjpeg")
      {
        /* Nastavení scriptu */
               
        /* cesta z rootu webu - každý má jinou podle svého serveru, ke které připojíme název fotky */
        $root = "/php/htdocs/www/tutorialy/tut4/" . $_FILES["fotka"]["name"];
       
        /* nahraná fotka do Temporary adresáře */
        $fotka = $_FILES["fotka"]["tmp_name"];
       
        /* cesta k vodoznaku */
        $vdz = "./vodoznak.png";
       
       
        /* Průběh scriptu - vložení vodoznaku a uložení na server */
       
        $size_fotka = getImageSize($fotka); /* zjistí velikost fotky */
        $size_vdz = getImageSize($vdz); /* zjistí velikost vodoznaku */
       
        $new = imageCreateTrueColor($size_fotka[0],$size_fotka[1]); // vytvoří nové černé plátno o rozměrech fotografie
        $image = imageCreateFromJpeg($fotka); /* načte do proměnné fotografii */
        $copy = imageCreateFromPng($vdz); /* načte do proměnné vodoznak */
       
        $dst_x = $size_fotka[0] - $size_vdz[0]; /* vypočítá souřadnice umístění vodoznaku */
        $dst_y = $size_fotka[1] - $size_vdz[1]; /* vypočítá souřadnice umístění vodoznaku */
       
        imageCopyResized($new, $image, 0, 0, 0, 0, $size_fotka[0], $size_fotka[1], $size_fotka[0], $size_fotka[1]); /* vloží obrázek do plátna; */
        imageCopyResized($new, $copy, $dst_x, $dst_y, 0, 0, $size_vdz[0], $size_vdz[1], $size_vdz[0], $size_vdz[1]); /* vloží obrázek do plátna; */
       
        $save = imageJpeg($new, $root, 70); /* Uloží obrázek na adresu $root se 70% kvalitou */
       
        imageDestroy($new); // zruší mezipamět obrázku
        imageDestroy($image); // zruší mezipamět obrázku
        imageDestroy($copy); // zruší mezipamět obrázku
     
      }
      else
      {
      echo "Fotka musí být ve formátu JPEG";
      }  
    }
   
    if($save) echo "Fotografie byla úspěšně uložena";
    else echo "Fotografii se nepodařilo nahrát na server!";
?>

<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  </head>
  <body>

  <form action="" method="post" enctype="multipart/form-data">
 
  <input type="file" name="fotka" />
  <input type="submit" name="odesli" value="Nahrát soubor" />
 
  </form>
 
  </body>
</html>
 
 


Autor článku: wayet | Vytisknout článek | Odeslat e-mailem

Hodnocení: 6.8/10 (28 hlasováno)

Komentáře (11)
od: Frosty 13-04-2008 18:29:11
Hm Hm... musím říct, že číst tvé články mě velmi těší.. považuju tě za prvního vynikajícího redaktora:)

A možná kdybys jsi zapracoval i na nějakých ukázkách tak by si byl ještě lepší :) Myslím, že by to i uživatelé ocenily:)

;-)

od: wayet 13-04-2008 19:10:15
Diky moc těší mě že se Vám moje tuty líbí :-)
akorát pořád nechápu jaký ukázky mam dávat :-P ono se těžko dá ukázka na takovýhle příklad. Když bych jí někam umístil tak každý bude nahrávat a zapáce místo na disku. Podle mě si takovýhle příklad musí vyzkoušet každý sám doma na svém disku nebo hostingu
;-)

od: Frosty 15-04-2008 18:16:33
:) Já nemyslel zrovna na tento přiklad, myslel jsem to všeobecně např: navštěvní kniha, počitadlo atd..

od: wayet 15-04-2008 20:48:55
Však miniseriál počítadel jsem začal už dva tuty zpátky jenže bylo schváleno teprve teď tak se zobrazuje v seznamu až dole a tak si ho asi nikdo nevšim :-D no další díl du psát právě teď tak se můžeš těšit ;-)

od: mt 07-05-2008 09:17:21
Tutos je dobrej, ale mam problem, ze kdyz misto $_FILES['neco']['name'] napisu treba neco.jpg, tak mi to hlasi, ze to je invalidni image resource. nevis co s tim??

od: Mato 08-05-2008 10:53:20
Spatna cesta mt.

od: wayet 10-05-2008 17:37:05
Teď malinko nechápu kam co píšeš. Ty to $_FILES['neco']['name'] nepřepisuješ. To je proměnná která se sama vytvoří odesláním formuláře jestli správně chápu tvůj dotaz

od: mt 16-05-2008 16:18:25
moc se omlouvam, ja jsem se prepsal v pismenku a napisto $vdz jsem psal porad $vzd a divil se, ze mi to nejede :-[

od: wayet 30-05-2008 13:40:08
No vidiš :-D a už to funguje správně?

od: pelpet 22-11-2009 12:47:15
:-( Já prostě nwm... Mě to nejde - asi jsem jediný ale prostě to nechápu. Nemohl by mi někdo poslat zdrojový kód na pelpet@hulic.cz ?? Zkoušel jsem všechno co mě napadlo ale výsledky žádné...

od: pelpet 22-11-2009 12:54:57
:-[ Oj já jsem pako... ono to je napsané dole celé :roll:

  Neregistrovaní uživatelé nemohou přidávat komentáře k článkům.