我有一个ajax调用调出一个表单,这个ajax调用成功使用变量var = value& var2 = value2等字符串。所以我知道AJAX响应正在工作。
将表单加载到AJAX响应中后,将解析需要运行的任何Javascript。我有一个我正在构建的小程序,它修改了表单以上传四个图像。
$inRetailImages = "<script>ImgShower.init()</script>";
$inRetailImages .= "<div id=\"retailimagescontainer\"></div>";
这解析好并加载Javascript applet,然后用于将四个图像加载到其中。加载四个图像时,它会使用每个图像的输入修改表单。我在浏览器调试器中看到了这种情况。
input = document.createElement('input');
input.id= "addShowerImage" + id;
input.name= 'addShowerImage' + id;
input.type='file';
input.size='40';
input.runat = 'server';
input.style.display = 'none';
input.accept='image/jpeg';
input.onchange = function(){ ImgShower.select(id); }
formparent.appendChild(input);
这会将输入附加到当前表单。这是有效的,因为当我使用字符串而不是表单对象提交没有图像的表单时,表单识别输入虽然它们不是有效的图像,但是当通过一串变量提交AJAX调用时,它需要值本地文件目录,显然不是需要的,但显示AJAX调用正在运行,PHP的进程脚本正在运行。不上传图像时,此表单非常有效。
if(isString(params)){
params = params + '&mode=' + mode;
contenttype = 'application/x-www-form-urlencoded';
}
else if (isObject(params)){
params.mode = mode;
queryparams = Request.getQueryParamsAsObject(params.params);
Objects.merge(params, queryparams);
delete params["params"];
var formParams = new FormData();
for (key in params) {
formParams.append(key, params[key]);
log("error", "FormData Key: " + key + " Data:" + params[key]);
}
params = formParams;
//contenttype = "multipart/form-data;Charset=UTF-8;boundary=xxxxx;";
//contenttype = 'application/x-www-form-urlencoded';
EDIT: I CHANGED THE CONTENT TYPE TO FALSE
contenttype = false;
AND PUT AN IF STATEMENT TO PUT NO HEADER IN THE AJAX SEND
AND EDITED
formParams.append(key, params[key] || "");
SO THAT THE PASSED VALUES WERE NOT EMPTY AND THE FORM SENDS
IT STILL WONT PASS AN IMAGE FILE TO $_FILES BUT THIS MADE IT FILL $_REQUEST
}
我有一个脚本,它从表单中获取所有值并将其转换为Object Array。在调试器中,我可以按预期看到表单中的所有值,包括四个图像中每个图像的FileItem。当从上面的脚本查看日志将其加载到formData对象时,我可以看到有效的条目,它们看起来都很好。
我尝试了多种内容类型,我尝试只发送没有表单数据的对象,我尝试在表单数据中添加一个新的表单包装器,我尝试为formData对象命名一个新的表单包装器,我有浏览了我的PHP设置,并浏览了这个列表。
Why would $_FILES be empty when uploading files to PHP?
要注意的列表相当广泛,我的php.ini设置似乎很好。
当我使用application / x-www-form-urlencoded提交表单时,我在响应中看到一个大的多部分,但它没有填充$ _REQUEST,$ _POST或$ _FILES,因为人们会感觉到。它使用一个变量和多部分数据加载$ _REQUEST。
当我使用multipart / form-data提交表单时,我将Googles网络选项卡中的响应视为发送到PHP服务器的Payload,但在PHP端,它不会填充$ _REQUEST,$ _POST或$ _FILES一点都不
这就是我在开发人员工具的Google Chromes网络标签上的请求和响应的有效负载中看到的内容。
------WebKitFormBoundaryp39DDe2JV8jjxA5j
Content-Disposition: form-data; name="addRetailName"
asdasd
------WebKitFormBoundaryp39DDe2JV8jjxA5j
Content-Disposition: form-data; name="addRetailCode"
TEST001
------WebKitFormBoundaryp39DDe2JV8jjxA5j
Content-Disposition: form-data; name="addRetailManuf"
etc for 34 fields
此表单有34个字段,+ 4个添加的字段使用javascript更新表单。这些图像也可以在Payload中看到。
------WebKitFormBoundaryzmu5mDvaLNnvsolE
Content-Disposition: form-data; name="addShowerImage1"
[object FileList]
为什么不填充$ _REQUEST和$ _FILES数组。我使用print_r($ _ REQUEST)或print_r($ _ FILES)在PHP中输出数组,并获取array()作为响应。
我没有收到任何文件,也没有收到任何表单数据。然而,我看到多部分是在请求的有效载荷中发送的。
我使用的是没有库且没有jscript的纯javascript。我更喜欢用纯JavaScript编写。
我还应该声明,我使用的是IIS 7和PHP 5.4的Windows 7终极机器。通过FastCGI。
调用ajax时,表单由请求函数传递和收集。此功能滚动表单中的所有项目并收集其值或内容。这适用于所有基于文本的内容。
我调用所有文件输入
var inputs = formObj.getElementsByTagName("input");
然后遍历那些输入
case "file":
values[input_name] = inputs[i].files;
break;
return values;
我甚至尝试过
values[input_name] = inputs[i].files[0]; returns File and not FileList
我在Payload中得到了这个
------WebKitFormBoundaryqsinSx1UoPEKAYOD
Content-Disposition: form-data; name="addShowerImage1";
filename="13006682_10208925038300663_5601989752145619827_n.jpg"
Content-Type: image/jpeg
这是一个对象数组
values{var1: value1, filevar: File}
似乎FileList / File出现在这里。这是在收到表单提交的最开始,遍历所有表单值的函数看到文件&gt; fileList。我没有看到除fileList以外的任何内容。