8.2. A képfeltöltési procedúra
Két fájlra lesz
szükségünk amivel megoldhatjuk, hogy a felhasználó az általa a 'sajátgépéről'
kiválasztott *.jpg fájlt fel tudja tölteni a megfelelő helyre:
- egy a tallózást és a feltöltés indítását kezelő (tallozas.html) html fájlra (ez az amit az image_upload.swf fájl upload_btn-ja egy popup ablakba nyit) és
- egy, a tényleges feltöltést kezelő, és annak rendben menetelét követően a pictnamesender.swf fájt megnyitó upload.php fájlra
- tallozas.html:
Keresd ki a
feltöltendő fájlt! <br>
(non-interlaced *.jpg, mérete maximum 300*200 pixel!) <br><br>
<form action="upload.php" method="post"
enctype="multipart/form-data">
File:
<input type="file" name="userfile" >
<input name="submit" type="submit"
value="Feltöltés!">
</form>
49. ábra
A tallózás gombra kattintva felnyílik az operációs rendszer fájlkezelő ablaka, az itt kiválasztott fájl nevét pedig a feltöltés gombra kattintva 'userfile' paraméterként átadjuk az upload.php fájlnak, ami ugyanebben a popup ablakban fog megnyílni. Érdemes a felhasználó figyelmét felhívni rá, hogy csak nem progressive (non-interlaced) jpg fájlt érdemes feltölteni, hiszen a flash csak ezeket tudja megjeleníteni, illetve megadhatunk pár a kép méretével kapcsolatos kikötést, amelyeket aztán majd ellenőrzünk is, hogy ne lehessen óriás képeket feltölteni.
- upload.php:
<?php
// a könyvtár -ahova a feltöltendo képet rakni szeretnénk- elérési útjánala(*1)
$uploaddir = "images";
// a kép maximális méretei
$max_height = "200";
$max_width = "300";
// a feltölthető kép lehetséges kitejesztése
$allowed_ext = "jpg";
// kiterjesztés, szélesség, magasság ellenőrzése(*2)
$fileinfo = pathinfo($_FILES['userfile']['name']);
$fileextension = "$fileinfo[extension]";
list($width, $height, $type, $w) =
getimagesize($_FILES['userfile']['tmp_name']);
if($height > $max_height || $width > $max_width || $fileextension !=
$allowed_ext){
print "A fájl nem .jpg kitejesztésű
vagy a kép nagyobb 300*200 pixelnél<br>";
print "<A href='javascript:
self.close ()'>Ablak bezárása!</A>";
exit;
}
// Fájl feltöltése(*3)
if(is_uploaded_file($_FILES['userfile']['tmp_name'])){
// a feltöltött fájl attributumának
módosítása(*4)
if (chmod($_FILES['userfile']['tmp_name'],
0644)){
// a
célkönyvtárba való töltés
if
(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploaddir.'/'.$_FILES['userfile']['name']){
}else{
print
"problémák adódtak a feltöltéssel, próbálkozzon újra<BR>";
print
"<A href='javascript: self.close ()'>Ablak
bezárása!</A>";
exit;
}
}else{
print
"problémák adódtak a feltöltéssel, próbálkozzon újra<BR>";
print "<A href='javascript: self.close ()'>Ablak bezárása!</A>";
exit;
}
}else{
print "problémák adódtak a
feltöltéssel, próbálkozzon újra<BR>";
print "<A href='javascript:
self.close ()'>Ablak bezárása!</A>";
exit;
}
//siker esetén innen folytatjuk(*5)
$neve=$_FILES['userfile']['name'];
print "A fájl sikeresen feltöltődött.";
//pictnamesender.swf fájl megnyitása(*6)
print "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0'
width='460' height='90'>
<param name='movie' value='pictnamesender.swf?pict_to_send=$neve'>
<param name=quality value=high>
<embed src='pictnamesender.swf?pict_to_send=$neve'
quality=high pluginspage='http://www.macromedia.com/shockwave/download/index.cgi?P1_
Prod_Version=ShockwaveFlash' type='application/x-shockwave-flash' width='460'
height='90'></embed>
</object>";
?>
Mi is történik
tehát a fentiekben:
*1 - a feltöltendő képet az 'images' könyvtárba fogjuk rakni (a már kész image_upload.swf fájlunkban is ezt
az útvonalat adtuk meg....). Érdemes odafigyelni, hogy ez a könyvtár 0777
attribútumú hozzáféréssel rendelkezzen, hogy a fájlfeltöltés lehetséges legyen.
*2 - a feltöltendő fájl (a nevét 'userfile' paraméterként kapta meg a php)
különbőző jellemzőinek ellenőrzése. Itt korlátozhatjuk a kép méretét is, ahogy
azt a tallozas.html
fájlnál jeleztük is. Amennyiben a kép bármilyen paramétere nem stimmel (esetleg
nem is jpg képet próbált a user feltölteni), úgy hibaüzenetet küldünk és
kilépünk a php-ból, az elegancia kedvéért egy popup bezárási lehetőséggel.
*3 - A fájl szerveroldali feltöltésének menetét is ellenőrizzük, bármilyen hiba
esetén ugyancsak kilépünk a php-ből az előbb már írt elegáns módon :).
*4 - Ez az ellenőrzés a php alapbeállításaitól függően esetlegesen nem is
szükséges, ami miatt itt szerepel, hogy számos tárhely-szolgáltatónál az így
feltöltött fájl attribútuma 0600 lesz, ami egyben azt is jelenti, hogy átlagos
user (és ebből a szempontból a image_upload.swf
fájl is 'átlagos user') nem fér hozzá a fájlhoz, azaz betölteni sem tudja.
Ezért módosítjuk az attribútumot 0644-re (azaz bárki által olvashatóra).
Megjegyzendő, hogy ugyancsak a php alapbeállításaitól függően ez a módosítás
esetlegesen nem engedélyezett.
*5 - Ha minden rendben ment, a fájl feltöltődött, akkor a felhasználó
tájékoztatása végett kiírathatjuk a sikert jelző üzenetünket...
*6 - ...és egyúttal ugyanebbe az ablakba beágyazzuk a pictnamesender.swf fájt, úgy, hogy
annak 'pict_to_send' nevű paraméterként átadjuk a feltöltött kép nevét (lásd a
kiemelést!). (A screenshot kicsit csalóka, mert már tartalmazza ezt a fájlt,
holott még nem volt róla szó, de ez csak pillanatok kérdése...)
50. ábra
Kész is volnánk a fájlfeltöltéssel, egyetlen feladat maradt hátra, a kép nevét
elküldeni az arra azóta is türelmesen várakozó image_upload.swf -nek.