У меня есть форма, которая динамически создается с помощью document.createElement. Компоненты создаются таким же образом. Форма используется для загрузки файла в PHP-скрипт и при отправке загружает ответ в iframe, указанный целевым атрибутом формы.
К сожалению, сервер получает пустой массив $_FILES, и когда я проверяю запрос POST, я вижу, что данные файла не были включены в запрос. Если вместо этого я на лету использую инструменты разработчика Google Chrome для редактирования динамически созданной формы (в этом процессе я просто РЕДАКТИРУЮ, а затем абсолютно ничего не меняю в коде), отправка формы после этого работает отлично, отправляя соответствующие данные файла .
Так что это заставляет меня понять, что нет ничего плохого в построении моей формы в html, потому что она работала без каких-либо изменений. Что наводит меня на мысль, что браузеру не нравится, когда я динамически создаю элементы ввода файла?
Для полноты картины вот динамически сгенерированная форма:
<form method="POST" action="includes/uploadPic.php"
enctype="multipart/form-data" target="fileResponse">
<input type="file" name="pic">
<input type="submit" value="Upload">
</form>
А print_r($_FILES)
дает пустой массив на сервере.
Кто-нибудь может мне это объяснить? Моя альтернатива состоит в том, чтобы статически создать скрытую форму в документе и просто добавить ее в соответствующий div, когда мне это нужно, но мне очень не нравятся такие вещи.
Ниже приведен код, который генерирует форму:
var form = document.createElement("form");
var fileUpload = document.createElement("input");
var uploadBut = document.createElement("input");
form.setAttribute("method", "POST");
form.setAttribute("action", "includes/uploadPic.php");
form.setAttribute("enctype", "multipart/form-data");
form.setAttribute("target", "fileResponse");
fileUpload.setAttribute("type", "file");
fileUpload.setAttribute("name", "pic");
uploadBut.setAttribute ("type", "submit");
uploadBut.setAttribute ("value", "Upload");
form.appendChild(fileUpload);
form.appendChild(uploadBut);
dlgContent.appendChild(form);
dlg
я сделалdlg.innerHTML=dlg.innerHTML
, и теперь это работает. Почему? Я понятия не имею. Спасибо :) - person rewolf   schedule 05.07.2011