XMLHttpRequest" total"获取JSON时返回0

时间:2015-02-25 21:23:26

标签: php ajax json

更多编辑

在几个浏览器上测试代码后,似乎我只能在FireFox上获得XMLHttpRequest.lengthComputable为真,从而给我一个下载百分比。 Chrome和Safari都会返回false ...有什么想法可以解决这个问题吗?我在PHP脚本的顶部添加了header("Access-Control-Allow-Origin: *");标记。

修改

好的,在评论的帮助下,我让我的PHP发送了Content-Length但是,evt.total仍然会返回0.任何想法?

经过进一步测试后,似乎evt.lengthComputable设置为false - 因此它忽略了evt.total ...现在我需要找出原因。

以下是标题中的数据

Request Method:GET
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:(deleted data here for confidential reasons)
Origin:(deleted data here for confidential reasons)
Referer:(deleted data here for confidential reasons)
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36

Response Headers
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Encoding:gzip
Content-Length:1914150
Content-Type:application/json
Date:Wed, 25 Feb 2015 22:38:22 GMT
Server:Apache
Vary:Accept-Encoding

原始帖子

也许这是一个愚蠢的问题,但在这里......

我正在使用私人PhoneGap应用程序,该应用程序本质上是一个公司目录。当应用程序首次启动时,它会检测到尚未下载存储的JSON为空,并提示用户开始下载。

我使用AJAX调用获取JSON数据。 JSON由我们的服务器上的PHP生成,该服务器查询数据库,构建数组,然后json_encode并回显输出。

数据传输到我们的应用程序,一切都运行良好,但是,我想建立一个" Progress Meter"下载需要我确切知道发送的数据有多大。我知道PHP有一些方法可以获取某些文件的文件大小,例如filesize($somefile),但我怎样才能测量JSON数据的字节大小?甚至可以这样做吗?以下是我正在使用的一些代码...

PHP构建JSON数据

while(...fetch the data) {

    $output[] = 
         array (
         "id" => $row['id'],
         "firstname" => $row['firstname'],
         "lastname" => $row['lastname'],
         "jobtitle" => $row['jobtitle'],
         "phone" => $row['phone'],
         "cell" => $row['cell'],
         "email" => $row['email'],
         "department" => $row['department'],
         "sub" => $row['sub'],
         "image" => $row['image']
    );

}

echo json_encode($output);

我在这里使用AJAX获取JSON: (我正在使用Framework7 - 因此$$)

$$.ajax({           
    url: "my-site-here.php",
    dataType: "json",
    beforeSend: function(XMLHttpRequest) {

        //Download Progress Attempt (Found By Googling)
        XMLHttpRequest.addEventListener("progress", function(evt){

        //console.log("Downloaded: " + evt.loaded)     <-- THIS IS WORKING;
        //console.log("Total: " + evt.total)           <-- THIS RETURNS 0;

        var percentComplete = evt.loaded / evt.total;
            console.log(percentComplete);

        if (evt.lengthComputable) {
            var percentComplete = evt.loaded / evt.total;
            console.log(percentComplete);
        } else {
             // console.log("Cannot Compute File Size"); <-- THIS IS WHAT OUTPUTS
        }
        }, false);
    },
    success: function(json) {
            // GETS DATA, RENDERS IT
    }
});

提前感谢您的一些见解!

2 个答案:

答案 0 :(得分:1)

我在这里找到了这个解决方案:https://stackoverflow.com/a/24073356/2163226

我所要做的就是编辑我的.htaccess文件以显示Content-Length标头。 现在一切都按预期工作了!

谢谢大家的帮助和建议!

答案 1 :(得分:0)

编辑 - 误解了请求流程。