Domov arrow Programovanie arrow Upload suborov s PHP
Upload suborov s PHP
Hodnotenie čitateľov: / 20
SlabéVynikajúce 
PHP logoSprtkal som sa v PHP a prisiel s jednoduchymi no ucinnymi riadkami kodu, ktore Vam pomozu nahrat (upload) subory na server. Co k tomu potrebujeme: server na ktorom bezi PHP (napr. Apache) a ma asi 2 kilobajty volneho miesta na disku :) A samozrejme trosku usilia (pri kopirovani a vkladani kuskov mojho kodu do vasich stranok).

V mojom priklade si ukazeme ako sa uploaduju obrazky typu JPG a o velkosti < 100'000 B na server do zlozky "uploads". Vyhotovime si dva subory: index.php a uploadFile.php, ktorych mena nahovaraju, aka bude ich funkcia.

Obsah suboru index.php je nasledovny:

<html>
<head>
<script type="text/javascript">
	function checkFileExt(form) {
		val = form.uploadedfile.value;
		ext = (val.substr(val.length-3,3)).toUpperCase();
		if (ext!="JPG") {
			document.getElementById("msg").innerHTML = "The file must be a JPEG (.jpg)";
			return false;
		} else
			return true;
	}
</script>
</head>
<body style="padding:20px;text-align:center">
	<sub>Maximum file size: 100 000 B</sub>
	<form 
		name="fileForm" 
		action="uploadFile.php" 
		method="POST" 
		enctype="multipart/form-data" 
		onSubmit="return checkFileExt(this);">
		Upload this file to the server:
		<input type="hidden" name="MAX_FILE_SIZE" value="100000" />
		<input type="file" name="uploadedfile" size=30 />
		<?php if ($_GET['ftb']==1) {
			echo "<p style=\"color:#ff0000\">The file was too big...</p>";
		}?>
		<p style="color:#ff0000" id="msg"></p>
		<p><input type="submit" value="Upload!" /></p>
	</form>
</body>
</html>

Vlastne sa sklada len z hlavicky, v ktorej je umiestneny JavaScript pre overenie suborovej pripony, dalej z tela, v ktorom je maly formular na odoslanie suboru. Index.php spracuvava jeden URL parameter, ktory moze byt pripojeny skriptom uploadFile.php a signalizuje ze odoslany subor bol privelky. JavaScript skontroluje posledne tri pismena zo zvoleneho suboru a v pripade, ze nie su JPG, na formulari sa v poli s ID msg zobrazi sprava o chybe (The file must be a JPEG). Tolko pre rychle vysvetlenie kratkeho kodu index.php

Na rad prichadza subor uploadFile.php, ktory vlastne spracuvava samotny nahrany subor.

<?php
	// FALSE ak nechcete subor ulozit na servri (pre testing)
	// TRUE ak chcete nahrany subor ulozit na servri
	$doUpload = true;

	//zlozka uploads musi existovat, inac upload zlyha
	$target_path = "uploads/" . basename($_FILES['uploadedfile']['name']);
	$errorcode = $_FILES['uploadedfile']['error'];

	//pripojime URL parameter, pre zobrazenie chyboveho hlasenia
	if ($errorcode == 2) {
		header('Location:index.php?ftb=1');
	}

	if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
		echo "File (". $_FILES['uploadedfile']['name'] . ") uploaded.";
		echo "<img src=\"{$target_path}\" />";
		//zmaz subor ked musis
		if (!$doUpload) { unlink($target_path);} 
	} else {
		echo "File upload failed.";
		echo '<br/>Here is some more debugging info:<br/>';
		echo "<pre>";
		print_r($_FILES);
		echo "</pre>";
	}
	echo "<p><a href=\"index.php\" title=\"index\">Back</a>";
?>

Tento script sa zameriava na premiestnenie docasneho suboru (subor hned po upload-e ma svoje tmp_name a je len docasny - bude zmazany hned po ukonceni script-u) do spravnej zlozky pre permanentne uchovanie.

Najprv si prichysta cestu k buducemu umiestneniu suboru, potom skontroluje ci nahodou upload nezlyhal z dovodu prilisnej velkosti suboru (a ak ano, tak prenaviguje prehliadac nazad na index.php stranku s URL parametrom, ktory bude v index.php rozpoznany a potrebna chybova sprava bude ukazana uzivatelovi). Potom sa pokusi uploadnuty subor premiestnit na svoje spravne miesto, pricom ked zlyha, tak vypise vsemozne informacie pre debugging, inac len ukaze spravu, ze vsetko prebehlo v poriadku a uploadnuty JPG obrazok zobrazi na stranke. Napokon sa prida linka nazad na hlavnu stranku index.php.

Detaily

Zatial som vsetko uviedol a vysvetlil len z rychlika a teraz poskytnem lepsie, detailnejsie vysvetlenie toho co sa udialo vo vyssie uvedenych dvoch script-och. Hoci sa jedna len o necelych 1000 pismen na kazdy z tychto dvoch suborov, je v nich napchate viac nez treba

Predpokladam len jednu vec, ze HTML je vam do urcitej miery jasne a ze nemusim vysvetlovat ako vznikla na stranke uploadFile.php hyperlinka na index.php. Alebo podobne drobnosti ohladne farieb ci velkosti textu. Aj PHP ste dufam uz videli, resp. ste si o nom cosi citali a viete preco sa niekde uvadza \" namiesto " ci ako sa pouziva $ pred premennymi ci . (bodka) pre spajanie textu.

index.php

V subore index.php si vsimnite hlavne ako je stavany tag FORM. <form name="fileForm" action="uploadFile.php" method="POST" enctype="multipart/form-data" onSubmit="return checkFileExt(this);">. Je v nom nielen meno, akcia (aky skript ma prijat obsah nasho formulara), metoda (POST - vzdy pri zasielani vecsieho mnozstva dat), ale i enctype, ktory urcuje ako maju byt data zaslane na server poskladane. Pre odoslanie na php script tento enctype musi byt "multipart/form-data". Taktiez sme umiestnili validaciu suboroveho typu do obsluhy udalosti onSubmit: onSubmit="return checkFileExt(this);" V tejto troske sa vlastne zavola funkcia checkFileExt(), ktoru sme nadefinovali v hlavicke nasej stranky, s parametrom this, ktory vlastne reprezentuje samotny formular, z ktoreho je tato funkcia zavolana. V pripade, zeby nam funkcia checkFileExt() vratila hodnotu false, formular by sa neodoslal, teda ziadne data by neputovali na server (co je ta pomala cast z toho celeho triku).

Dalsia cast, ktoru by bolo vhodne okomentovat, je tato: <input type="hidden" name="MAX_FILE_SIZE" value="100000" />. V tomto riadku do formulara vlozime neviditelny komponent s menom MAX_FILE_SIZE a hodnotou 100000. Tento komponent, hoci ho na obrazovke nevidime, bude zaslany na server, v pripade ze formular prejde JS validaciou a data pocestuju k uploadFile.php. Jeho hodnota bude vyuzita PHP k tomu, aby upload zlyhal v pripade, ze prijaty subor je vecsi. Tento komponent musi byt umiestneny na formulari hned pred polickom do ktoreho zadavame nazov suboru (nema byt medzi nimi ziaden iny aktivny element formularu). Pokial ho neuvedieme, bude jeho hodnota nacitana priamo z PHP konfiguracneho suboru PHP.ini.

uploadFile.php

Premennu doUpload si mozeme nevsimat. Do premennej $targetpath si pripravime cestu k suboru po uploadnuti. V nasom priklade to je zlozka "uploads/", ktoru si musime vytvorit prv nez do nej zacneme nakladat subory. Okrem toho, ze zlozka musi existovat, taktiez sa musime ubezpecit, ze mame do nej pravomoc subory zaipsovat. Pouzijeme svoj oblubeny FTP klient, aby sme nastavili pravomoci na tejto zlozke (ja zo zvyku davam 777 -rwx), inac by sme dostali plnu obrazovku chyboveho hlasenia.

Potom sa pokusime pomocou PHP funkcie move_uploaded_file premiestnit docasny subor na spravne miesto. Ak toto uspeje, tak je vsetko ako ma byt a zobrazime nejaku stranku s textom, ze vsetko prebehlo OK a ukazeme stiahnuty obrazok pomocou tag-u IMG a nastavime jeho SRC (zdroj) na danu adresu nahraneho suboru. V opacnom pripade vypiseme chybove hlasenie.

$_FILES

Este trosku k datovemu polu $_FILES. V tomto poli najdeme informacie o natiahnutych suboroch. Zadame nazov komponentu, o ktoreho subor mame zaujem (komponent typu "file" umiestneny vo formulari v subore index.php), aby sme mohli ziskat nazov, velkost, typ, atd... oneho stiahnuteho suboru.

V nasom priklade pouzivame len vlastnosti tmp_name, name, a error, no ked si vyguuglujete $_FILES na internete, tak zistite, ze existuju aj vlastnosti size a type. Vsimnite si v kode, ze ako krasne a lahko sa pouzivaju. Tak to je hadam vsetko, co sa k uploadu z mojho prikladu da povedat. Este existuje cela veda ohladne uploadov (zistovanie progresu prebiehajuceho uploadu, resp. odosielanie suborov pomocou AJAX-u, odosielanie a spracovavanie viacerych suborov naraz, atd...), no ja som vas chcel oboznamit len s jednoduchou tematikou. (Ved sam nie som prave PHP guru :) hehe)

Posledná úprava ( Sunday, 31 July 2011 )
 
< Predchádzajúca   Ďalšia >