动态创建的HTML文件输入元素不发布数据

时间:2011-06-30 17:44:46

标签: php javascript html file-upload dhtml

我有一个使用document.createElement动态创建的表单。组件以相同的方式创建。该表单用于将文件上载到PHP脚本,并在提交时将响应加载到由表单的target属性指定的iframe中。

不幸的是,服务器收到一个空的$ _FILES数组,当我检查POST请求时,我看到文件数据未包含在请求中。如果我在运行中,使用谷歌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);

2 个答案:

答案 0 :(得分:0)

试试这个:

var form = document.createElement("form");
var fileUpload  = document.createElement("input");
var uploadBut   = document.createElement("input");

form.method = "POST";
form.action = "includes/uploadPic.php";
form.enctype = "multipart/form-data";
form.target = "fileResponse"; /* I think you are trying to submit this from in an iframe */
fileUpload.type = "file";
fileUpload.name = "pic";
uploadBut.type = "submit";
uploadBut.value = "Upload";
form.appendChild(fileUpload);
form.appendChild(uploadBut);
dlgContent.appendChild(form);

答案 1 :(得分:0)

如果将form标记放在div标记内,则不会将动态创建的元素发布到服务器。但是,如果您将其置于divtable标记之外,则无效。