Upload

Upload - faili kasutaja arvutist serverisse saatmine.

Lihtne näide

See on lihtsaim võimalik viis _turvaliseks_ faili üleslaadimiseks. $path kataloogile tuleb anda kirjutamisõigused.

<?php
 
// kaust kuhu fail liigutatakse pärast faili üleslaadimist
$path = 'failid/';
 
if(isset($_FILES['failike']))
{
  // liigutame faili suvalise nime all $path-ga määratud kataloogi
  move_uploaded_file($_FILES['failike']['tmp_name'], $path . uniqid('up_').'.dat');
}
?>
<form action="?" method="POST" enctype="multipart/form-data"> 
  <input type="file" name="failike">
  <input type="submit" value="Upita">
</form>

Failinimi on meelega muudetud suvaliseks .dat failiks, kuna vastasel korral saab nt php failide üleslaadimisega kõiksugu pahandust korda saata.

Nagu näha, tuleb formile lisada enctype atribuut sisuga „multipart/form-data“ ning failivalimis väli (file-tüüpi).

Peale ankeedi serverisse suunamist on üleslaetud faili(de) andmed globaalmuutujas $_FILES, mille sisu on järgnev:

  • $_FILES['failike']['name'] – faili nimi koos laiendiga
  • $_FILES['failike']['type'] – faili mimetüüp nt. text/plain
  • $_FILES['failike']['tmp_name'] – faili ajutine asukoht serveris
  • $_FILES['failike']['size'] – faili suurus baitides
  • $_FILES['failike']['error'] – veakood; kui upload õnnestub siis UPLOAD_ERR_OK (0)

Keerukam näide

Siin kontrollitakse, :

  • kas koht uploaditavate failide jaoks on olemas
  • kas fail on korrektselt üles laetud
  • kas fail on lubatud tüüpi
  • ega failisuurus ei ületa lubatud mahtu
  • ega sellist faili juba olemas ei ole
<?php  
 
// kaust kuhu fail liigutatakse pärast faili üleslaadimist 
$path = '_files/';
 
// lubatud faililaiendid (ainult pildid)
$extensions = array('jpg', 'png', 'gif');
 
// lubatud maksimaalne faili suurus baitides (100 KB)
$max_size = 1024*100;
 
// veakoodide tekstid
$upload_errors = array(
  UPLOAD_ERR_OK => 'Upload oli edukas.',
  UPLOAD_ERR_INI_SIZE => 'Uploaditav fail on suurem kui php.ini-s määratud upload_max_filesize-ga',
  UPLOAD_ERR_FORM_SIZE => 'Uploaditav fail on suurem kui MAX_FILE_SIZE näidatud HTML formis',
  UPLOAD_ERR_PARTIAL => 'Uploaditava fail on ainult osaliselt üleslaetud',
  UPLOAD_ERR_NO_FILE => 'Faili ei olnud määratud',
  UPLOAD_ERR_NO_TMP_DIR => 'Puudub ajutine töökataloog.'
);
 
if(!is_writable($path))
{
  exit('kataloogi '.$path.' ei ole võimalik kirjutada');
}
 
if(isset($_FILES['failike']))
{
  $err = $_FILES['failike']['error'];
 
  // kui uploadmisel tekkis viga väljastame veateate põhjusega ning lõpetame skripti töö
  if($err != UPLOAD_ERR_OK)
  {
    exit ('Tekkis viga: ' . $upload_errors[$err]);
  }
 
  // leiame failisuuruse
  $size = filesize($_FILES['failike']['tmp_name']);
 
  // juhul kui faili suurus on lubatud suurem kuvame veateate ning lõpetame skripti töö 
  if($size > $max_size)
  {
    exit('Faili suurus on lubatust suurem'); 
  } 
 
  // leiame faililaiendi
  $extension = end(explode('.', $_FILES['failike']['name']));
 
  // kontrollime kas faililaiend on lubatud faililaiendite hulgas
  if(!in_array($extension, $extensions)) 
  { 
    exit('Tegu pole sobiva faililaiendiga');
  }
 
  // asendame failinimes täpi- jms tähed alakriipsuga
  $fn = preg_replace('|([^a-z0-9.-])+|i', '_', $_FILES['failike']['name']);
  $fullpath = $path . $fn;
 
  // kontrollime faili olemasolu
  if(is_file($fullpath))
  {
    exit('Sellise nimega fail on juba olemas');
  }
 
  if(move_uploaded_file($_FILES['failike']['tmp_name'], $fullpath))
  {
    echo 'Fail on üleslaetud. Seda saab <a href="', $fullpath ,'">siit allalaadida</a>.'; 
  }
  else
  {
    echo 'Faili liigutamine ebaõnnestus';
  }
}
?> 
<form action="?" method="post" enctype="multipart/form-data"> 
  <input type="file" name="failike"> 
  <input type="submit" value="Upita"> 
</form>

Veel1näide:

Metaandmed (suurus, maht, tüüp, …) lisatakse MySQL baasi, fail ise failisüsteemi. Lubatakse lisada ainult õiges suuruses pildifaile.

<?php
/**
 
Esiteks tekita sellise struktuuriga andmetabel:
 
CREATE TABLE `failid` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `nimi` varchar(40) NOT NULL default '',
  `suurus` int(10) unsigned NOT NULL default '0',
  `tyyp` varchar(20) NOT NULL default '',
  `kirjeldus` varchar(200) NOT NULL default '',
  `laius` int(11) NOT NULL default '0',
  `korgus` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;
 
 
**/
 
// kataloog, kuhu pildid pannakse (ära unusta chmodi)
define('direktoorium', 'failid/');
 
// piltide max mõõtmed
define('max_x', 1024);
define('max_y', 768);
 
// mysql ühenduse andmed
mysql_connect('localhost', 'root', ''); 
mysql_select_db('baas');
 
if(!is_writeable(direktoorium))
{
	exit('ei saa kirjutada kataloogi '. direktoorium .' tsõhhamood seitse-seven-sem');
}
 
if(!empty($_POST))
{
	// fail on antud ning upload õnnestus
	if($_FILES['fail']['error']==UPLOAD_ERR_OK && $_FILES['fail']['size']>0)
	{
		// leiame faililaiendi
		$laiend = strtolower(end(explode('.', $_FILES['fail']['name'])));
 
		// moodustame suvalistest märkidest failinime
		$failinimi = md5(uniqid(rand(), true)).'.'.$laiend;
 
		// leiame pildifaili mõõtmed ning tüübi
		$size=getimagesize($_FILES['fail']['tmp_name']);
 
		// kas tegemist on pildifailiga (lähemalt uuri funktsiooni getimagesize)
		if(!in_array($size[2], array(1,2,3)))
		{
			$teade = "Lubatud on ainult GIF, JPG ja PNG failid!";
		}
		elseif($size[0]>max_x || $size[1]>max_y)
		{
			$teade = "Pildimõõtmed on lubatust suuremad";
		}
		else
		{
			// lisame asja baasi
			$id = mysql_query('INSERT INTO failid SET
				  nimi = "'.mysql_real_escape_string($failinimi).'"
				, kirjeldus = "'.mysql_real_escape_string($_POST['kirjeldus']).'"
				, suurus = "'.mysql_real_escape_string($_FILES['fail']['size']).'"
				, laius = '.mysql_real_escape_string($size[0]).'
				, korgus = '.mysql_real_escape_string($size[1]).'
				, tyyp = "'.mysql_real_escape_string($_FILES['fail']['type']).'"
			') or exit('viga: '.mysql_error());
 
			// kui baasipanek õnnestus
			if($id)
			{
				// liigutame faili temp-kataloogist sihtkataloogi
				if(move_uploaded_file($_FILES['fail']['tmp_name'], direktoorium . $failinimi))
				{
					$teade = 'Upload õnnestus!';
				}
				else
				{
					$teade = 'Faili liigutamine töökataloogist --> kataloogi '.direktoorium.' ebaõnnestus senituvastamata põhjustel. Asja uurib kombluspolitsei.';
				}
			}
		}
	}
	else
	{
		$teade = "Upload ebaõnnestus: #".$_FILES['fail']['error'];
	}
}
?>
<p><b><?php echo isset($teade) ? $teade : ''?></b></p>
<form method="post" action="?" enctype="multipart/form-data">  
Kirjeldus:<br>  
<input type="text" name="kirjeldus" size="40">  
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">  
<br>Fail:<br>  
<input type="file" name="fail" size="40">  
<p><input type="submit" name="submit" value="submit">  
</form>

Ja kolmas näide ei jää neljandata

Võimalik on fail ka kogu saba ja sarvedega andmebaasi salvestada.

Arvamusi selle mõistlikkusest on seinast-seina:

Asi iseenesest on lihtne - failisisu loetakse muutujasse ning paigutatakse BLOB (binary large object) tüüpi välja sisse. Vastava näite leiab siit: http://web.zone.ee/internetu/php/binary_into_mysql/

 
upload.txt · Viimati muutnud: 2009/01/03 23:55 persoon laurik
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki