2011-06-30 23 views
4

我有一个使用document.createElement动态创建的表单。组件以相同的方式创建。该表单用于将文件上传到PHP脚本,并在提交时将响应加载到由表单的目标属性指定的iframe中。动态创建的HTML文件输入元素不发布数据

不幸的是,服务器收到一个空白的$ _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); 
+2

您是不是将您的动态创建的表单添加到另一个

元素中? – AndrewR

+0

您是否查看过实际的HTTP事务以查看浏览器发送的内容?至少有一个适用于Firefox的插件([Tamper Data](https://addons.mozilla.org/en-US/firefox/addon/tamper-data/)),它会向您显示来自浏览器的所有HTTP事务,并让您基本上检查一切。 – Pointy

+0

@AndrewR不是嵌套形式 @Pointy我提到我检查了POST请求。一切似乎都是正确的,只是它好像文件输入被忽略。 – rewolf

回答

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); 
0

如果你把form标签的div标签内,它并没有发布动态创建的元素添加到服务器。但是,如果您将其放在divtable标记之外,它就会起作用。

相关问题