【问题标题】:Unable to get AJAX's post values (plain Javascript)无法获取 AJAX 的 post 值(纯 Javascript)
【发布时间】:2014-07-03 15:19:27
【问题描述】:

我知道这个问题已在此论坛 (Unable to get values in POST php web serivce) 中得到解答,但问题和答案都使用了 jQuery,就我而言,我无法使用它(无论如何)...

所以,我有一个 Javascript 文件,旨在制作画布的“屏幕捕获”(使用“toDataURL()”函数)并使用 AJAX 将其发送到 PHP 文件。由于要发送的数据很长,不能使用“GET”方法(AJAX返回414错误:“URL TOO LONG”),所以需要使用“POST”。

我遵循了一些关于 plain Javascript 的示例(这些示例并不容易找到,因为每个人都使用 jQuery!:P),我的代码如下所示:

var dataURL = me.video.getScreenCanvas().toDataURL();

var req = false;
try{
req = new XMLHttpRequest();
} catch (e){
// IE
try{
    req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
    // try an older version
    try{
    req = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e){
    return false;
    }
}
}

req.onreadystatechange = function(){
    if(req .readyState == 4){
    if(req.status == 200)
    { 
        console.log("RESULT AJAX: "+req.responseText);
    }else{ 
        console.log("ERROR AJAX: returned status code "+req.status+" "+req.statusText); 
    }
    }
}

req.open("POST", "http://www.mywebpage.com/image_upload.php", true);
req.setRequestHeader("Content-type","application/x-www-form-urlencoded");
req.send("imgdata="+dataURL);

当尝试记录“dataURL”变量的内容时,它会记录一个像“image/png...blablabla”这样的大字符串,所以我认为数据是按预期生成的。

此时,PHP 文件只是尝试检索结果:

<?php

$imageData = '';

if(isset($_POST['imgdata']))
{
    echo "correct POST!";
    $imageData = $_POST['imgdata'];
}else if(isset($_GET['imgdata'])){
    echo "correct GET!";
    $imageData = $_GET['imgdata'];
}

echo "ImgData: ".$imageData;

if($imageData != '')
{
    $imageData = str_replace(' ','+',$imageData);
    $decodedData = base64_decode($imageData);

    if(file_put_contents('imatge1.jpeg', $decodedData) !== FALSE)
    {
        echo "Image has been successfully processed...?";
    }else{
        echo "Error trying to process the image...";
    }
}

?>

但是,PHP 文件没有回显“POST”或“GET”消息,“ImgData”回显返回空,并且没有回显“成功”或“处理图像时出错”消息......所以 PHP 文件似乎无法检索到 AJAX 的“POST”方法传递的数据。

我做错了什么?我怎样才能只使用 plain Javascript 来解决这个问题(不要使用 jQuery 很重要)?

提前感谢您的时间和精力! :)

【问题讨论】:

  • 控制台的回复信息是什么?
  • 1.在你的 PHP 脚本之上执行一个简单的var_dump($_POST),看看你是否得到任何东西。 2. 在浏览器的开发者工具中查看请求,有什么明显的地方吗?
  • “var_dump”返回了“array(0){ }”,所以我猜 PHP 脚本什么也没有得到……我不能使用浏览器的开发者工具,因为我正在运行这个东西来自移动应用程序(不在网络浏览器中运行)......

标签: javascript php ajax post todataurl


【解决方案1】:

我更改了您的 javascript,并对此进行了测试,如果它适用于您,请尝试:

function create_XHR(){
    var XHR = null;
    if (window.XMLHttpRequest){
        XHR = new XMLHttpRequest();
    }
    else if(window.ActiveXObject){
        try {
            XHR = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            XHR = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    else {
        alert("Your navigator is old to run objets XMLHTTPRequest...");
        XHR = false;
    }
    return XHR;
}


function ajax_post(page, data) {

    var XHR = create_XHR();
    XHR.open("POST", page, true);
    XHR.onreadystatechange = function() {
        if (XHR.readyState === 4 && (XHR.status === 200 || XHR.status === 0)) {
            console.log("Success Transaction");
        }
    };
    XHR.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XHR.send(data);
}


//Running the code :
//==================
var dataURL = me.video.getScreenCanvas().toDataURL();
ajax_post("http://www.mywebpage.com/image_upload.php", {"imgdata":dataURL});

修改 cors http : 在服务器 PHP 中将其添加到页面的第一个“image_upload.php”:

//Part added by ilyas :
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }
//End of part.

【讨论】:

  • 嗨伊利亚斯!上周五我确实测试了你的代码,但 StackOverflow 在我工作时处于读取模式,所以我无法回答你......结果是一样的:PHP 文件无法从“POST”中检索任何内容。尽管“GET”方法工作正常,但我为“POST”尝试了不同的方法,但似乎没有任何效果......我的 Javascript 文件在“CocoonJS”中运行(这是一个类似于 PhoneGap 的环境,用于制作 HTML 和 JS代码在移动设备应用程序上运行)和我的 PHP 文件存储在我自己的服务器中......你认为可能会发生什么?
  • 为了检查发布的数据是否是问题的原因,我测试了它发送一个简单的字符串“imateststring”而不是dataURL,但没有任何改变......
  • @Johanovski:所以,我认为您对“http cors header”有疑问。如果在这种情况下您的 HTML5 应用程序和服务器不在同一主机下,则这是一个限制。但是有一些解决方案可以解决这个问题:D。我会更新帖子。
  • 嗨伊利亚斯!我添加了您建议的代码,并且我在“setRequestHeader”调用中附加了一个“charset=UTF-8”,现在它正在工作!但是,我发现我的服务器能够检索数据的唯一方法是通过 "$GLOBALS['HTTP_RAW_POST_DATA'];" "$_POST" 的 insetad... 我读到 CocoonJS(我用来在移动设备上运行 JS 的框架)有一些与 AJAX 和 POST 相关的错误,所以整个事情可能来自那里...但是,你的答案真的很有帮助,所以我会将其标记为已接受。谢谢你的时间! ;)
【解决方案2】:

我认为您需要在文件 httpd.conf 中配置服务器 apache

在 Apache 下,限制是一个可配置的值,LimitRequestLine。如果您想支持更长的请求 URI,请将此值更改为大于默认值 8190。

改变:

LimitRequestLine 4094

到一个值

【讨论】:

  • 我不确定这是否是问题所在......正如我所说,AJAX 在尝试使用其“GET”方法时会抛出该错误,但现在我正在尝试使用“POST”一个(应该没有大小限制)......使用这个,AJAX 不会抱怨任何东西太长:它根本不会说什么!我想知道的是为什么在 PHP 中什么也没做,但也没有返回 AJAX 错误...
  • 删除行:req.setRequestHeader("Content-type","application/x-www-form-urlencoded");告诉我你有新的变化
  • 我删除了该行,不,没有任何改变...... CBroe 建议的“var_dump”调用仍然返回一个空数组......
  • @Johanovski:你在下面的帖子中测试过我的代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多