【问题标题】:Nginx Upload Progress module - differing XMLHttpRequest behavior on local instance and webserverNginx 上传进度模块 - 本地实例和网络服务器上不同的 XMLHttpRequest 行为
【发布时间】:2014-01-26 16:22:05
【问题描述】:

嗨,我基本上是在做一个上传器并使用 nginx 上传进度模块。我不明白为什么它在本地机器上的本地机器上运行良好(给 XMLHttpRequest readyState 4,javascript 进度条 % 相应增加)但是当我在服务器上部署它时似乎无法获得任何服务器响应(虽然它显然确实连接到 /progress,但一直给 XMLHttpRequest readyState 1)

就跟平常的nginx上传进度模块代码一样:

function fetch(uuid) {
    req = new XMLHttpRequest();
    req.open("GET", "/progress", true);
    req.setRequestHeader("X-Progress-ID", uuid);
    req.onreadystatechange = function () {

        /* checking the state here ..*/
        console.log(req.readyState);
        console.log(req.status);

        if (req.readyState == 4) {
            if (req.status == 200) {

             /* poor-man JSON parser */
             var data = eval(req.responseText);
             console.log(data.state);

             if (data.state == 'done' || data.state == 'uploading') {
                prog = Math.floor(100 * (data.received / data.size));
                $("#progressbar").progressbar({value: prog});
                $("#percentage").html(prog+"%");
             }
             if (data.state == 'done' || data.received >= data.size) {
                window.clearTimeout(timeout);
             }
          }
       }
    }
    req.send(null);
};  

这里是控制台日志: 本地 nginx 实例正常

[22:12:25.734] POST http://localhost:8080/?X-Progress-ID=5b8702050a784e6604953201e398c99a [HTTP/1.1 200 OK 1335ms]
[22:12:25.677] "initialized"
[22:12:25.838] GET http://localhost:8080/progress [HTTP/1.1 200 OK 0ms]
[22:12:25.783] 2
[22:12:25.783] 200
[22:12:25.784] 3
[22:12:25.784] 200
[22:12:25.784] 4
[22:12:25.784] 200
[22:12:25.784] "uploading"

测试服务器不行

[00:16:20.638] POST http://00.mydomain.com/?X-Progress-ID=c65681d605911db0b8da3fb0e436d851 [HTTP/1.1 200 OK 2925ms]
[00:16:20.582] "initialized"
[00:16:20.738] GET http://00.mydomain.com/progress [HTTP/1.1 200 OK 293ms]
[00:16:21.039] GET http://00.mydomain.com/progress [HTTP/1.1 200 OK 304ms]
[00:16:20.979] 1
[00:16:20.979] 0
[00:16:20.979] 1
[00:16:20.979] 0
[00:16:20.979] 1
[00:16:20.980] 0
[00:16:21.341] GET http://00.mydomain.com/progress [HTTP/1.1 200 OK 304ms]
[00:16:21.286] 1
[00:16:21.286] 0
[00:16:21.287] 1
[00:16:21.287] 0
[00:16:21.287] 1
[00:16:21.287] 0
...keeps repeating till upload complete...

我的错误可能出在哪里的任何线索?

【问题讨论】:

    标签: nginx upload xmlhttprequest uwsgi


    【解决方案1】:

    原来是对 /progress 的 GET 请求的异步/同步问题...仍在调查该问题,以便我可以使用异步,但基本上是在我更改时

    req.open("GET", "/progress", true);
    

    req.open("GET", "/progress", false);
    

    它开始在我的服务器上运行

    **UPDATE**:原来是一个愚蠢的拼写错误/剪切粘贴错误,应该是

    var req = new XMLHttpRequest();
    

    所以不知何故,js 错误在本地和服务器实例上的行为不同,有时会被忽略...现在异步上传过程(带有进度条和可恢复)工作正常!

    **旁注**:主要 Nginx wiki 上用于 json 解析的示例

    var data = eval(req.responseText);
    

    确实不安全,但我注意到 nginx 上传进度模块返回格式错误的 JSON,例如

    ({ "state" : "uploading", "received" : 8671, "size" : 2218274 });
    

    这样做会更好

    /* non-poor-man JSON Parser */
             var response = req.responseText;
             var jsonlen = response.length;
             var jsondata = response.slice(1, jsonlen-4); //note returned json is malformed
             var data = JSON.parse(jsondata);
    

    【讨论】:

      猜你喜欢
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多