<?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>Блог Ромки &#187; javascript</title>
	<atom:link href="http://romka.name/tags/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://romka.name</link>
	<description></description>
	<lastBuildDate>Sat, 20 Nov 2010 15:47:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Загрузка файлов в стиле AJAX</title>
		<link>http://romka.name/2009/12/zagruzka-fajlov-v-stile-ajax.html</link>
		<comments>http://romka.name/2009/12/zagruzka-fajlov-v-stile-ajax.html#comments</comments>
		<pubDate>Tue, 22 Dec 2009 13:07:48 +0000</pubDate>
		<dc:creator>Ромка</dc:creator>
				<category><![CDATA[Программируем]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[загрузка файлов]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://romka.name/?p=18</guid>
		<description><![CDATA[
			
				
			
		

      Собственно, первая статья на тему сайтостроения, не судите строго (:
      Значит в данный момент технология AJAX стала довольно популярной, а ведь действительно, очень удобно отправлять и получать данные без обновления страницы, экономит траффик, да и вообще это стильно. Аналогично есть и jquery, с этой системой вообще не знаком, но вроде принцип такой же - [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fzagruzka-fajlov-v-stile-ajax.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fzagruzka-fajlov-v-stile-ajax.html&amp;source=romkaby&amp;style=normal&amp;service=is.gd&amp;hashtags=html,javascript,php,%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2,%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" height="61" width="50" /><br />
			</a>
		</div>
<p style="text-align: justify;"><img class="size-full wp-image-19 alignleft" title="Загрузка файлов в стиле AJAX" src="http://romka.name/wp-content/uploads/2009/12/Загрузка-файлов-в-стиле-AJAX.jpg" alt="" width="350" height="200" /></p>
<p style="text-align: justify;">      Собственно, первая статья на тему сайтостроения, не судите строго (:<br />
      Значит в данный момент технология AJAX стала довольно популярной, а ведь действительно, очень удобно отправлять и получать данные без обновления страницы, экономит траффик, да и вообще это стильно. Аналогично есть и jquery, с этой системой вообще не знаком, но вроде принцип такой же - обмен информации с сервером без обновления страницы. Но есть загвоздка, эти новшества позволяют обмен данными, текстом, но на загрузку файлов это никак не распространяется. Они просто не предусмотрены для этого... И вот тут на помощь приходит язык PHP в связке с JavaScript!<span id="more-18"></span><br />
      Насчём с алгоритма, как всё это будет происходить. Из обычной формы данные о файле должны поступить на страницу загрузки, а чтобы пользователь не заметил, данный файл будет держать в скрытом айфрейме, а вместо кнопки "Загрузить" напишем, например, "ждите, идёт загрузка", ведь мало ли какой пользователь попадётся, будет нам не в тему психопатически жать на кнопки, а нам, естественно, это не нужно, да и вообще, надо же ему показать, что началась загрузка, ведь айфрейм у на скрытый (:. Далее php скрипт, скрывающийся в невидимом айфрейме, загружает файл и делат всё, что ему нужно и выводит данные, но полькольку он скрытый - нам нужно вывести текст "загружено" на главную страницу, или же на страницу "родителя", так как скрипт был запущен именно с этой, родительской страницы. Тут на помощь приходит JavaScript, который по id на родительской странице находит куда вставить этот текст. Впринципе, на этом скрипт заканчивается, теперь попробуем это написать.</p>
<p style="text-align: justify;">      Для начала напишем форму. Помним, что нам надо заменять кнопку всяким текстом, от скрипта, т.е. кнопка будет внутри поля, которое будет меняться. Это так:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;div id=&quot;res&quot;&gt; код_кнопки &lt;/div&gt;</pre></td></tr></table></div>

<p>      В данном случае, текст будет появляться между тэгами, там же должна быть и кнопка.<br />
И так же знаем, что при нажатии на кнопку (событие onsubmit) нам надо вывести текст "подождите, идёт загрузка". Так же не забываем, что у нас должен быть и скрытый айфрейм.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;form action=&quot;upload.php&quot; name=&quot;uploadForm&quot; method=&quot;post&quot; target=&quot;hiddenframe&quot; enctype=&quot;multipart/form-data&quot;  onsubmit=&quot;document.getElementById('res').innerHTML='Подождите, идёт загрузка...';return true;&quot;&gt;
&lt;input type=&quot;file&quot; name=&quot;userfile&quot; /&gt;&lt;br /&gt;
&lt;div id=&quot;res&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;Загрузить&quot;  /&gt;&lt;/div&gt;
&lt;/form&gt;
&lt;iframe id=&quot;hiddenframe&quot; name=&quot;hiddenframe&quot; style=&quot;width:0px; height:0px; border:0px&quot;&gt;&lt;/iframe&gt;</pre></td></tr></table></div>

<p style="text-align: justify;">      Разберём параметры тэга form:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">action=&quot;upload.php&quot;</pre></td></tr></table></div>

<p>      Указывает файл, который нужно открыть, т.е. который будет выполнять загрузку файла.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">name=&quot;uploadForm&quot;</pre></td></tr></table></div>

<p>      Имя формы</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">method=&quot;post&quot;</pre></td></tr></table></div>

<p>      Метод передачи данных. Бывает GET (тогда данные передаются через ссылку, т.е. появляются параметры, например index.php?name=vasya&amp;family=pupkin) и POST (передаются незаметно для юзера). Для передачи файлов годится только POST.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">enctype=&quot;multipart/form-data&quot;</pre></td></tr></table></div>

<p>     Здесь мы указываем тип данных.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">onsubmit=&quot;document.getElementById('res').innerHTML='Подождите, идёт загрузка...';return true;&quot;</pre></td></tr></table></div>

<p>      При нажатии кнопки "Загрузить" у нас срабатывает событие onsubmit. Состоит из двух частей:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'res'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'Подождите, идёт загрузка...'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Помещает текст "подождите, идёт загрузка" в поле, между нашими тэгами div. А находит его по id, который указан и в этом коде, и в параметре тэга div. У нас id в обоих случаях res.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Этот код сообщает, чтобы обработчик не остановился, а передал данные в айфрейм. Если вместо true написать false, то обработчик поймёт, что мы его вызвали только для смены текста и ничего отправлять не будет.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">target=&quot;hiddenframe&quot;</pre></td></tr></table></div>

<p>      А вот благодаря этому и получается, что сам скрипт загрузки открывается не в окне юзера, а во фрейме с именем hiddenframe.<br />
      Это всё, что должно содержаться в index.html</p>
<p style="text-align: justify;">      Теперь рассмотрим содержание файла upload.php... Что десь должно быть? Как и в обычном скрипте загрузка файла через функцию:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">move_uploaded_file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'имя_поля_файла'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tmp_name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'локальный_адрес_куда_загружать_файлы'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Дальше интересней, нам нужна функция, которая будет отправлять сообщение "загружено" на родительскую страницу. Я использую для этого такой код:</p>
<p style="text-align: justify;">

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> sendtext<span style="color: #009900;">&#40;</span><span style="color: #000088;">$out</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;script type=&quot;text/javascript&quot;&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'window.parent.document.getElementById(&quot;res&quot;).innerHTML=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$out</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/script&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Это PHP-функция, которая, в свою очередь, печатает JavaScript код вставки текста:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">parent</span>.<span style="color: #660066;">document</span>.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;res&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;'.$out.'&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Именно этот JS код находит по id (сдесь опять указано res) на родительской странице нужный участок, куда впихнуть текст.<br />
      Итак, у нас есть php-функция, которая может напечатать текст "загружено" таким образом:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="php" style="font-family:monospace;">sendtext<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'загружено'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>      Итак, вот содержание файла upload.php:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">function</span> sendtext<span style="color: #009900;">&#40;</span><span style="color: #000088;">$out</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;script type=&quot;text/javascript&quot;&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'window.parent.document.getElementById(&quot;res&quot;).innerHTML=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$out</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;;'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;/script&gt;'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">move_uploaded_file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'имя_поля_файла'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tmp_name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'локальный_адрес_куда_загружать_файлы'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
sendtext<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'загружено'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>      Вот, собственно, и всё! Единственное, что хочу заметить, что если передавать через данную функцию текст с ковычками, то перед ними надо ставить обратный слаш \, иначе будет неправильно работать js-код.</p>
<p style="text-align: justify;"><a title="Пример этого скрипта" href="http://romka.name/script/index.php?p=1" target="_blank">Пример этого скрипта</a></p>
<p><img width='45' height='15' border='0' src='http://counter.feedcount.net/sko36k5ii7wsgh70i3mbm4fo6o8hm1.jpg' /></p>
<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fzagruzka-fajlov-v-stile-ajax.html"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fromka.name%2F2009%2F12%2Fzagruzka-fajlov-v-stile-ajax.html&amp;source=romkaby&amp;style=normal&amp;service=is.gd&amp;hashtags=html,javascript,php,%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2,%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" height="61" width="50" /><br />
			</a>
		</div>
]]></content:encoded>
			<wfw:commentRss>http://romka.name/2009/12/zagruzka-fajlov-v-stile-ajax.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

