Динамическое клонирование поля и AJAX

Привет, помогите пожалуйста, такая вот проблема есть.Код из страницы
<script type="text/javascript">function duplicateHTML(copy,paste,baseid){        if(document.getElementById(copy))        {            e107_dupCounter++;            var type = document.getElementById(copy).nodeName; // get the tag name of the source copy.            var but = document.createElement('input');            var br = document.createElement('br');            but.type = 'button';            but.value = 'x';            but.className = 'button';            but.onclick = function(){ this.parentNode.parentNode.removeChild(this.parentNode); };            var destination = document.getElementById(paste);            var source      = document.getElementById(copy).cloneNode(true);            var newentry = document.createElement(type);            newentry.appendChild(source);            newentry.value='';            newentry.appendChild(but);            newentry.appendChild(br);            if(baseid)            {                newid = baseid+e107_dupCounter;                newentry.innerHTML = newentry.innerHTML.replace(new RegExp(baseid, 'g'), newid);                newentry.id=newid;            }            destination.appendChild(newentry);        }}function doLoad(value) {    var req = new JsHttpRequest();    req.onreadystatechange = function()     {        if (req.readyState == 4)         {            getID('result_upload').innerHTML += req.responseJS.q;            hideload_image();        }    }    req.open('POST', 'upload_images.php', true);    req.send({action:'upload_image', q:value});    showload_image();}</script><div id='up_container'><span id='upline'><input type="file" name="upl[]" id="up"></span><br /></div><input type="button" class="admin_button" value="Добавить картинку" onClick="duplicateHTML('upline','up_container');" />&nbsp;&nbsp;&nbsp;<div id="ajax_button"><input type="button" class="admin_button" value="Загрузить" onClick="doLoad(this.form.upl)"></div>
Кнопка - добавить картинку, клонирует файловые поля. Я понял, что раз в имени поля стоит [], то имена полей в итоге будут выглядеть так: upl[0], upl[1], upl[2]. Собственно так и есть, то есть можно подсчитать кол-во пришедших полей через пхп так: count($_FILES).Но вот задачто в том, что эта загрузка фоновая, через аякс. И вот как тут в ява скритпе сосчитать, кол-во отправляемых файлов (полей), и отправить это всё пхп скрипту в функции doLoad.   req.send({action:'upload_image', q:value}); - это для переменной, а как туда все поля поместить.... проблема.
4 ответа

function NewFileName(ob)    {        var str_filename;        var filename;        var str_file = ob.value;        var num = ob.name;        num  = num.substr(num.lastIndexOf("_")+1);        str_file = str_file.replace(/\\/g, '/');        filename = str_file.substr(str_file.lastIndexOf("/")+1);        document.uploidform["filename_"+num].value = filename;        if(document.uploidform['count_row'].value==num)            {   num++;            var tbl = getID('tupload');            var cnt = tbl.rows.length;            var oRow = tbl.insertRow(cnt);            var oCell = oRow.insertCell(0);        //    oCell.align = 'center';            //oCell.className = 'table';            oCell.innerHTML = '<input type="text" name="filename_'+num+'" class="input_l" size="30" maxlength="255" value="">';            var oCell = oRow.insertCell(1);            oCell.align = 'center';        //    oCell.className = 'table';            oCell.innerHTML = '<input type="file" name="file_'+num+'" size="30" maxlength="255" value="" onChange="NewFileName(this)">';            document.uploidform['count_row'].value = num;        }    }
<form enctype="multipart/form-data" name="uploidform"><input type="hidden" name="count_row" id="count_row" value="1" /><table width="50%" border="0" id="tupload">  <tr>    <td>Имя файла : </td>    <td>Файл для загрузки :</td>  </tr>  <tr>    <td><input type="text" name="filename_1" class="input_l" size="30" maxlength="255"/></td>    <td><input type="file" name="file_1"  value="" onChange="NewFileName(this)" size="30" maxlength="255" /></td>  </tr></table></form>
удали ненужный код а то битрикс обидится )));я уплоит сделал на флеше... быстрей передача проходит и есть контроль над отправкой и сколько отправил... 


То есть получается, что допустим, я загнал туда 5 файлов, но образовалось 6, шестой - будет пустым.и имена будут такие: file_1, file_2, file_3, file_4, file_5А как в JS функции, при отправки формы словить эти имена и выяснить сколько именно я файлов добавил, и создать массив, что бы отправить потом его в AJAX


для этого у тебя есть поле hide где ты делаешь колич. нумов... затем циклом создаешь массив где передаешь название полей с такими именами var arr = new Array();arr['num']  - кол полей суда заносиш из скрытого поля кол полей. на основе этих значений создаешь циклом еще элементыarr['file_1'] .. n // где file_1 .. n это полязатем все это отправляем через аякс req.open(null , '**********.php' , true);req.send(arr);в php
<?$dir = "/upload";//читаем сколько полейif(isset($_REQUEST['num']) and $_REQUEST['num']!='')   if(is_numeric($_REQUEST['num']){   for ($i=0; $i< $num; $i++){if (!isset($_FILES["file_".$i]) || !is_uploaded_file($_FILES["file_".$i]["tmp_name"]) || $_FILES["file_".$i]["error"] != 0) {        echo "проблема загрузки файла";        exit(0);     }else{         //копируем в нухную папку файл             move_uploaded_file($_FILES['Filedata']['tmp_name'], $dir."/".($_FILES['Filedata']['name']) );            }  }} ?>
ну что то примерно так. может чтото с именами не то при использование аякса...и еще я точно не знаю но кажется когда отправляешь файлы аяксом то каждый файл отправляется в разных потоках... а не все сразу. и это может не сработать..Тогда другой способ цеклический аякс
<script type="text/javascript">function $(id){return document.getElementById(id);}function showload(){document.getElementById('ajaxload').style.display = "block"}function hideload(){document.getElementById('ajaxload').style.display = "none"}function sendfile(){ var num = $('num').value;     for(var i=0; i < num; i++){      var req = new JsHttpRequest();  req.onreadystatechange = function() {  showload();  if (req.readyState == 4) {  hideload();  $('divotvet').innerHTML = req.responseJS.otvet; // это ответ    }  }  req.open(null , 'uploidfile.php' , true);  req.send('num':i,'file' : $('file_'+i).value); //$('file_'+i) мы ишим id элемента        //можно добавить еще поля для переименования файла на сервере  }         }}</script><div id="divotvet"></div>
в пхп 
require_once($_SERVER['DOCUMENT_ROOT']."/inc/JsHttpRequest.php");$Js = new JsHttpRequest('windows-1251');$dir = "/upload";// Имена элементов а $_REQUEST и $_FILES совпадают с  именами полей формы. if(isset($_REQUEST['num']) and is_numeric($_REQUEST['num']) {$num= $_REQUEST['num']; // это можно использовать потом...   if (!isset($_FILES["file"]) || !is_uploaded_file($_FILES["file"]["tmp_name"]) || $_FILES["file"]["error"] != 0) {        $GLOBALS['_RESULT']['otvet'] = "проблема загрузки файла";        exit(0);     }else{         //копируем в нухную папку файл             move_uploaded_file($_FILES['Filedata']['tmp_name'], $dir."/".($_FILES['file']['name']) );          $GLOBALS['_RESULT']['otvet'] = ' файл загружен :) ';            }}
проверь то что я написал апач не подругой так что могут быть ошибки...


Спасибо Sanchezzz, проверю)