Upload - faili kasutaja arvutist serverisse saatmine.
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:
Siin kontrollitakse, :
<?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>
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>
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/