$ _REQUEST和$ _FILES没有填充多部分/表单数据

时间:2016-05-16 09:45:18

标签: javascript php ajax

我有一个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以外的任何内容。

0 个答案:

没有答案