<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zoltanhosszu.com &#124; blog &#187; Ajax</title>
	<atom:link href="http://blog.zoltanhosszu.com/tags/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zoltanhosszu.com</link>
	<description>Zoltan Hosszu&#039;s blog about xHTML, CSS, JavaScript, PHP</description>
	<lastBuildDate>Wed, 07 Apr 2010 20:07:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ajax-szerű fájlfeltöltés PHP-val</title>
		<link>http://blog.zoltanhosszu.com/2009/05/ajax-szeru-fajlfeltoltes-php-val/</link>
		<comments>http://blog.zoltanhosszu.com/2009/05/ajax-szeru-fajlfeltoltes-php-val/#comments</comments>
		<pubDate>Tue, 12 May 2009 20:02:19 +0000</pubDate>
		<dc:creator>Zoltan</dc:creator>
				<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[fájl]]></category>
		<category><![CDATA[feltöltés]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[űrlap]]></category>

		<guid isPermaLink="false">http://blog.zoltanhosszu.com/?p=46</guid>
		<description><![CDATA[Ma elég huzamos ideig törtem a fejem és bújtam a fórumokat mire sikerült találnom egy olyan megoldást, amivel fel tudok tölteni egy fájlt anélkül, hogy frissülne az oldal. Hogy ez miért is kellett? A Kajdócsi Építész Stúdió adminisztrációs felületén dolgoztam és &#8211; bár később szántam-bántam, de &#8211; azt találtam ki, hogy amikor egy bizonyos bejegyzést [...]]]></description>
			<content:encoded><![CDATA[<p>Ma elég huzamos ideig törtem a fejem és bújtam a fórumokat mire sikerült találnom egy olyan megoldást, amivel fel tudok tölteni egy fájlt <strong>anélkül, hogy frissülne az oldal</strong>. Hogy ez miért is kellett? A Kajdócsi Építész Stúdió adminisztrációs felületén dolgoztam és &#8211; bár később szántam-bántam, de &#8211; azt találtam ki, hogy amikor egy bizonyos bejegyzést &#8211; esetünkben munkát &#8211; szerkeszt az ember, lehessen <em>&#8220;on-the-go&#8221;</em> fájlokat feltölteni. Nem akarjuk ugyanis egy külön elküldött form miatt az összes módosítást elveszteni, ugye?</p>
<p>Szóval nekiálltam, hogy akkor megtanulom a jQuery Ajax metódusait, de szerencsére ráakadtam egy <a href="http://www.ajaxf1.com/tutorial/ajax-file-upload-tutorial.html" target="_blank">nagyon hasznos kis kerülőre</a>. Ezt fogom most megosztani veletek.</p>
<p><span id="more-46"></span></p>
<p>Az első és legfontosabb dolog, hogy megértsük a <strong>&lt;form&gt;</strong> működését. A form &#8211; magyarul űrlap &#8211; egy olyan HTML tag, amivel egyszerű <strong>kitölthető mezőket</strong> tolhatunk a felhasználó arcába, ezzel rákényszerítve, hogy regisztrációkor megadja nekünk a haja színét és a kedvenc parfümének illatát. Ezek közé a mezők közé tartozik a fájl mező is. Az űrlap működése nagyon egyszerű, beillesztésekor megadjuk, hogy <strong>milyen módon</strong> (<em>method</em>), és <strong>hova</strong> (<em>action</em>) küldje az információkat, amiket a mezőkben megadtak a felhasználók.</p>
<p>A <strong>milyen módon</strong> rész <em>POST </em>vagy <em>GET </em>lehet, attól függően, hogy mennyire titkosan akarjuk küldeni az infokat. Elég másként lehet feldolgozni az adatokat, a <em>GET </em>ugyanis a címsorban küldi az adatokat (pl regisztracio.php?felhasznalo=jozsi&amp;jelszo=123456), míg a <em>POST </em>titkosan küldi tovább, de ezért ha használni akarunk egy-két adatot további oldalakhoz, akkor azokat tovább kell vinni valahogy (PHP-nál nagyjából úgy mint ahogy a <em>GET </em>metódus teszi).</p>
<p>Az<strong> űrlap</strong> <strong>hova része</strong> a feldolgozó fájl (esetünkben egy PHP lesz), ami kezeli a megkapott adatokat és tárolja vagy továbbküldi.</p>
<p>A formokban betöltött fájlokkal az a baki összesen, hogy azokat PHP-ban nem <em>$_POST</em> és nem is <em>$_GET</em>, hanem <strong><em>$_FILES</em></strong> előtaggal kell feldolgoznunk, hogy jussunk valahova. Ahhoz, hogy megkapjuk a kiválasztott fájlokat, az űrlapnak meg kell adnunk még egy attribútumot, ez pedig az <strong><em>enctype</em></strong>. Az <em>enctype </em>igazából az elküldött adatok titkosításának módja (nem ugyanaz mint a <em>POST</em>/<em>GET</em>), a fájlok feltöltéséhez szükséges értéke pedig <em>enctype=&#8221;multipart/form-data&#8221;</em>.</p>
<p>Nézzük is akkor hogy mire lesz szükségünk. Lesz egy form, ahol kiválasztjuk a fájlt; lesz egy PHP ami feldolgozza a fájlt; és egy JavaScript ami a vizualizációért felelős. Az űrlap nem lesz túl bonyolult, lássuk csak:</p>
<pre class="brush:php">  &lt;form action="upload.php" method="post" enctype="multipart/form-data" target="upload_target" &gt;
    Fájl: &lt;input name="myfile" type="file" /&gt;
    &lt;input type="submit" name="submitBtn" value="Upload" /&gt;
  &lt;/form&gt;</pre>
<p>Igazából néhány extra mezőre szükségünk lesz, hogy a JS is jól működjön:</p>
<pre class="brush:php">&lt;body&gt;
  &lt;p id="f1_upload_process"&gt;Feltöltés folyamatban...&lt;/p&gt;
  &lt;p id="result"&gt;&lt;/p&gt;
  &lt;form action="upload.php" method="post" enctype="multipart/form-data" target="upload_target" onsubmit="startUpload();" &gt;
    Fájl: &lt;input name="myfile" type="file" /&gt;
    &lt;input type="submit" name="submitBtn" value="Feltöltés" /&gt;
  &lt;/form&gt;
  &lt;iframe id="upload_target" name="upload_target" src="#" style="width:0px; height:0px; border:0px;"&gt;&lt;/iframe&gt;
&lt;/body&gt;</pre>
<p>Mint látjátok bekerült két &lt;p&gt; bekezdés és egy &lt;iframe&gt; belső frame, de ez utóbbi el van rejtve (width: 0px, height: 0px;). A keretre azért van szükségünk, mert ha megnézitek, az űrlapunk megkapta <em>target </em>attribútumnak az &lt;iframe&gt; nevét; magyarán <strong>oda fog betöltődni </strong>az<em> action=&#8221;upload.php&#8221;</em>. Ezzel le is lőttem a legnagyobb poént, amivel a fájlfeltöltés AJAX-szerűvé válik.  Egy finom kis CSS-t ráhúzunk az oldalra:</p>
<pre class="brush:css">#f1_upload_process{
  z-index: 100;
  position: absolute;
  visibility: hidden;
}</pre>
<p>Ezzel biztosítottuk, hogy a <em>#f1_upload_process</em> egyelőre láthatatlan legyen, mert majd a JavaScript teszi láthatóvá, a fájlfeltöltés elindításakor. Sok szó esett már a JavaScript részről, nézzük is meg, hogy mit tud. Egyelőre csak a <em>startUpload()</em> függvényt hívtuk meg az űrlap elküldésével. Ez a függvény igazából csak annyit tesz, hogy a már említett <em>#f1_upload_process</em> részt megmutatja nekünk és engedélyezi a form elküldését:</p>
<pre class="brush:js">function startUpload(){
  document.getElementById('f1_upload_process').style.visibility = 'visible';
  return true;
}</pre>
<p>A hangsúly nem is ezen a függvényen van, hanem a <em>stopUpload()-</em>on, ami a feltöltés eredményét fogja nekünk kiírni. Ezt a függvényt a PHP fájlból fogjuk meghívni majd.</p>
<pre class="brush:js">function stopUpload(success) {
  if (success == 1){
    document.getElementById('result').innerHTML = '&lt;span class="msg"&gt;Sikeres volt a fájlfeltöltés!&lt;/span&gt;&gt;';
  } else {
    document.getElementById('result').innerHTML = '&lt;span class="emsg"&gt;Hiba történt a feltöltés során!&lt;/span&gt;';
  }
  document.getElementById('f1_upload_process').style.visibility = 'hidden';
  return true;
}</pre>
<p>A függvényt egy success paraméterrel együtt hívhatjuk meg, ami az eredménynek megfelelő üzenetet dob ki a <em>&lt;p id=&#8221;result&#8221;&gt;</em> bekezdésünkbe. A vizualizációval meg is volnánk, nézzük meg, hogy mi is történik a háttérben. A PHP az űrlapból megkapott fájlt egyszerűen felmásolja a gyökérkönyvtárjába, majd 1 másodperces pihenő után (hogy a nagyon kicsi fájloknál is látszódjon, hogy történik valami <img src='http://blog.zoltanhosszu.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) meghívja a <em>stopUpload()</em> JS függvényt.</p>
<pre class="brush:php">&lt;?php
  $destination_path = getcwd().DIRECTORY_SEPARATOR;
  $result = 0;
  $target_path = $destination_path . basename( $_FILES['myfile']['name']);
  if(move_uploaded_file($_FILES['myfile']['tmp_name'], $target_path)) {
    $result = 1;
  }
  sleep(1);

  echo('&lt;script language="javascript" type="text/javascript"&gt;
    window.top.window.stopUpload(' . $result . ');
  &lt;/script&gt; ');

?&gt;</pre>
<p>Ezzel tulajdonképpen meg is volnánk. A dolog működik szépen, én is használom, használjátok ti is egészséggel! Ha bármilyen kérdés vagy észrevétel van, jöhet fórumba!</p>
<p>Forrás: <a href="http://www.ajaxf1.com/tutorial/ajax-file-upload-tutorial.html" target="_blank">ajaxf1.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zoltanhosszu.com/2009/05/ajax-szeru-fajlfeltoltes-php-val/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
