FireFox и клонирование input - files

Lord Maverik
На сайте с 15.04.2003
Offline
471
952

В общем проблема в следующем.

На Яве клонирую поле типа files, т.е. чтобы можно было произвольное кол-во файлов указать.

Каждому полю добавляется индекс, чтобы их отличать. Рядом с каждым полем для файла, простое текстовое поле. Метод POST.

Т.е. вид

текст1 - файл1... (- +)

текст2 - файл2... (- +)

текст3 - файл3... (- +)

Первое прописано жестко. Остальные два уже добавлены на яве.

В IE все пучком. А вот в Лисе проблема.

При передаче $_POST содержит все тексты.

Т.е.

$_POST['текст1'], $_POST['текст2'], $_POST['текст3'] имееют место быть.

А вот с $_FILES именно в лисе выходит облом.

$_FILES['текст1'] есть, а $_FILES['текст2'], $_FILES['текст3'] отсутствуют.

Кто может сталкивался? Как решить проблему?

RedMall.Ru (https://redmall.ru) - Товары из Китая (Таобао, Tmall) с проверкой качества, скидка для форумчан 7% Партнерская программа 2 уровня: 5% + 5%. Подробнее. (https://redmall.ru/about/partner/)
edogs software
На сайте с 15.12.2005
Offline
775
#1

Жаль Вы не привели Ваш js и html код, поэтому непонятно о чем речь.

Как вариант - у Вас не генерятся правильно в FF имена полей.

Кстати, в общем случае лучше не использовать name1, name2, name3, а использовать name[] - тогда и нумерация будет сохраняться без дополнительных телодвижений.

Вот накидали за 5 минут, это не далеко шедевр, т.к. в js мы не очень, но возможно Вам поможет, т.к. IE, FF, Opera tested:)

<script>

var t=0;
function add() {
t++;
a='<input type="text" name="text'+t+'"> <input type="file" name="ddd'+t+'"><br>';
a+='<div id="id'+(t+1)+'"></div>';// adding div and put always into div because we wanna keep older entered values
document.getElementById('id'+t).innerHTML=a;
return false;
}
</script>
<a href="#" onclick="return add();">add</a>
<a href="a.php">start</a>
<form ENCTYPE="multipart/form-data" method="post" action="a.php">
<input type="text" name="text0"> <input type="file" name="file0">
<br>
<div id="id1"></div>
<input type="submit" name="Submit">
</form>

<pre>
<?php
print_r($_FILES);
print_r($_POST);
die;
ob_start();
?>
Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
Lord Maverik
На сайте с 15.04.2003
Offline
471
#2

Ваш пример изучу. Вот мой. Поле


<input name="pictnm1" value="1" size=1 style="width:20px">
<input type="file" name="pictfu1" style="width:200px">
<input type="button" name="rbutton_pict" value=" - " onclick="mRemoveRow(this,'pict');" style="width:25px">
<input type="button" name="rbutton" value=" + " onclick="mAddRow(this,'pict');" style="width:25px">

Ява:


<!--
function mAddRow(obj,name){
if(document.getElementById) {
var iCounter = 0;

if ((name != '') && (typeof(name) != "undefined")) {
var aCounter = document.getElementsByName(name + "c");
if (aCounter.length > 0) {
aCounter[0].value++;
iCounter = aCounter[0].value;
}
}

tr = obj;
while (tr.tagName != 'TR') tr = tr.parentNode;
var newTr = tr.parentNode.insertBefore(tr.cloneNode(true),tr.nextSibling);

thisChilds = newTr.getElementsByTagName('input');

for (var i = 0; i < thisChilds.length; i++) {
if (!thisChilds.name.match(/rbutton/)) {
if (thisChilds.name.match(/soft/)) {
thisChilds.value = iCounter;
thisChilds.name = thisChilds.name.replace(/^(.+)(\d+)$/,"$1" + iCounter);
} else {
thisChilds.value = iCounter;
thisChilds.name = thisChilds.name.replace(/^(\D+)(\d+)$/,"$1" + iCounter);
}
}
}

thisChilds = newTr.getElementsByTagName('select');
for (var i = 0; i < thisChilds.length; i++) {
if (thisChilds.name.match(/soft/)) {
thisChilds.selectedIndex = 0;
thisChilds.name = thisChilds.name.replace(/^(.+)(\d+)$/,"$1" + iCounter);
} else {
thisChilds.selectedIndex = 0;
thisChilds.name = thisChilds.name.replace(/^(\D*)(\d*)$/,"$1" + iCounter);
}
}

thisChilds = newTr.getElementsByTagName('textarea');
for (var i = 0; i < thisChilds.length; i++) {
thisChilds.value = "";
thisChilds.name = thisChilds.name.replace(/^(\D*)(\d*)$/,"$1" + iCounter);
}

checkForLast(name);
}
}

function checkForLast(name) {
if (name != 'odoc') {
rButtons = document.getElementsByName('rbutton_' + name);
for (i = 0; i < rButtons.length; i++){
rButtons.disabled = (rButtons.length == 1) ? true : false;
}
}
}

function mRemoveRow(obj,name) {
if(document.getElementById) {
tr = obj;
while (tr.tagName != 'TR') tr = tr.parentNode;

thisChilds = tr.getElementsByTagName('input');
template = new RegExp("^" + name + "rec(\\d*)$","gi");
id = 0;

for (var i = 0; i < thisChilds.length; i++) {
if (template.exec(thisChilds.name)) {
id = thisChilds.value;
}
}

tr.parentNode.removeChild(tr);
if (id != 0) {
var el = document.createElement('<input type="hidden" name="del_' + name + '" value="' + id + '">');
document.forms.pform.appendChild(el);
}
checkForLast(name);
}
}
function clickHandler()
{var targetId, srcElement, targetElement;
srcElement = window.event.srcElement;
if (srcElement.id == "softswitch")
{targetId = "softdetails";
targetElement = document.all(targetId);
if (targetElement.style.display == "none")
{targetElement.style.display = "";}
else
{targetElement.style.display = "none";}}}
document.onclick = clickHandler;
//-->
Lord Maverik
На сайте с 15.04.2003
Offline
471
#3

Я сам в яве не шибко то силен. Брал код давно с какого-то сайта, адаптировал под себя.

edogs software
На сайте с 15.12.2005
Offline
775
#4

Ради интереса заморочились с Вашим примером

1) Для корректности Ваш тот html код (первый приведенный, с инпутами), должен быть

1а) Внутри формы

1б) Внутри ячейки таблицы

2) Заведите обязательно нечто вроде

<input type="hidden" name="pictc" value=1>

или внутри ячейки или снаружи ячейки, но обязательно внутри формы.

Иначе это вообще ни в IE ни в FF работать корректно не будет, будем максимум 2 поля разных. Т.к. это поле (точнее все поля с таким именем в данном случае) Ваш скрипт использует для сохранения "временных" переменных.

3) Перед всеми строками вида

			thisChilds.value = iCounter;

поставьте

if(thisChilds.type!='file')

Ошибка, очевидно, в том, что т.к. у file нету аттрибута value, то FF неадекватно (или наоборот, адекватно?) реагирует на попытку присвоить этот аттрибут input полю - прекращая работу вызываемого js. IE же забивает на эту попытку.

Lord Maverik
На сайте с 15.04.2003
Offline
471
#5

1. Оно так и есть

2. И это естественно есть

3. Попробовал. Помогло :) Сенкс.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий