Tutoriál PHP #6: Ako si vytvoriť jednoduché nahrávanie súborov na server s kontrolou dátovej veľkosti a kontrolou dátového typu

Tutoriál PHP #6: Ako si vytvoriť jednoduché nahrávanie súborov na server s kontrolou dátovej veľkosti a kontrolou dátového typu

Tutoriál PHP #5: Ako si vytvoriť jednoduché nahrávanie súborov na server - popisuje základný jednoduchý skript, ktorý vykoná upload súboru na server do príslušného adresára. Problém je ale v tom, že je možné nahrať akýkoľvek súbor a v dátovej veľkosti sa tiež medze neurčovali. Takto to samozrejme nemôžme nechať.  V tom to návode si ukážeme, ako spraviť upload súborov s kontrolou veľkosti (čo sa bajtov týka) a zároveň obmedziť možnosť nahrávaných súborov na určené typy, napr. obrázky.
Vytvoríme si jednoduchý formulár, pomocou ktorého realizujeme upload súborov na server:

<!--
keďže formulár bude odosielať priložené súbory, potrebujeme do hlavičky definovať 
atribút enctype="multipart/form-data, ktorý zabezpečí možnosť odoslať priložený 
súbor.
-->
<form action="#" method="post" enctype="multipart/form-data">
    <input type="file" name="subor">   
    <input type="submit" value="nahraj obrázok">
</form>

Vytvoríme dve funkcie, ktoré budú kontrolovať povolené prípony súborov a ich dátové veľkosti. Povolené budú prípony jpg, png, gif a bmp.
Povolená dátová veľkosť bude napr. 500000 bajtov.

<?php
// funkcia na kontrolu dátovej veľkosti
function kontrolaDatovejVelkosti($subor)
  {
     if($subor['size'] <= 500000)
	 return 1; 
    else
	return 0; 
  }


// funkcia na kontrolu prípony súboru
function kontrolaPripony($subor)
 {
  $povolene_pripony = array('jpg','JPG','gif','png','bmp');
  // do poľa si uložíme povolené prípony
			
	$pripona = pathinfo($subor['name'],PATHINFO_EXTENSION);
	 /*podmienka skontroluje, či sa prípona súboru, ktorý    
       nahrávane nachádza medzi povolenými príponami*/
          if(in_array($pripona,$povolene_pripony))          
			  return 1;
			else
			  return 0;
 }
?>

Ďalej je potrebné napísať samotný kód, ktorý na základe vrátenej hodnoty z oboch funkcií vykoná upload súboru na server do príslušného adresára. Funkciu na upload súborov move_uploaded_file() je podrobne popísaná v predošlom článku - Tutoriál PHP #5: Ako si vytvoriť jednoduché nahrávanie súborov na server

<?php

$subor = $_FILES['subor']; // odchytenie priloženého súboru z formulára
if (isset($subor)) // ak formulár obsahuje priložený súbor
{   
   //ak funkcie vrátia hodnotu 1,súbor sa nahraje
   if(kontrolaDatovejVelkosti($subor) == 1 and kontrolaPripony($subor) ==1 )  
 {
 move_uploaded_file($_FILES['subor']['tmp_name'],"downloads/".$_FILES['subor']['name']); 
 }
 else
 echo "súbor sa nenahral pre nepovolený formát";
}
?>

Pri volaní funkcie na kontrolu prípony sme použili ako vstupný parameter premennú $subor = $_FILES['subor'], ktorá obsahuje priložený súbor z formulára. Musím ale upozorniť na skutočnosť, že $_FILES[ ] je vlastne pole a okrem samotného súboru obsahuje  ďalšie informácie ako je typ súboru, dátová veľkosť, dočasný názov súboru a pod.. Naše funkcie ako vstupné parametre potrebujú z týchto všetkých údajov dva údaje: názov súboru, z ktorého  vyberieme pomocou funkcie pathinfo príponu, a dátovú veľkosť súboru udávanú v bajtoch.  Ak by sme použili na zobrazenie premennej $subor funkciu print_r(), videli by sme výpis celého poľa na obrazovke počítača, vyzeralo by to takto:
print_r($subor);
výsledok zobrazenia: Array ( [name] => leto.jpg [type] => image/jpeg [tmp_name] => /domains1/vx296800/public/tmp/phpUbVMnW [error] => 0 [size] => 78381 ).


Selekcia (výber) údajov z poľa

Funkcie, ktoré sme v našom príklade použili potrebujú parametre. Pri funkcii na kontrolu prípony je to prípona súboru (napr. jpg, png) a funkcia na kontrolu dátovej veľkosti potrebuje  číselný údaj v bajtoch.  Tieto údaje je potrebné "vybrať" z poľa $subor = $_FILES['subor'].  Použijeme pole Array, ktoré je zobrazené vyššie.  Údaje, ktoré potrebujeme, vyberieme takto:

<?php
   $subor // kompletné info o nahrávanom súbore
   $subor['size'] // vyberie údaj s dátovou veľkosťou v bajtoch (78381)
  $subor['name'] // vyberie údaj s názvom súboru vrátane prípony (leto.jpg)
  pathinfo($subor['name'],PATHINFO_EXTENSION) // vyberie údaj s príponou(jpg)
?>

Poznámka na záver: aby všetko správne fungovalo, nezabudnite si vytvoriť adresár s názvom "downloads", do ktorého sa súbory budú nahrávať. Jeho atribúty je potrebné nastaviť na 777.

Rubriky: