【问题标题】:How to post large amount of json data (not file) in nodejs/express如何在 nodejs/express 中发布大量 json 数据(不是文件)
【发布时间】:2011-12-06 12:30:32
【问题描述】:

所以我正在做一个上传大量 json 数据的 ajax(jquery) 帖子。发布大数据时,数据通常被分成块。所以我们必须监听发布数据请求并构造一个完整的上传数据缓冲区。像这样的:

    req.on('data', function(chunk) {
        console.log("upload on data "+ chunk.length);
        chunks.push(chunk);
        total+= chunk.length;
    });
    req.on('error', function(e) {
            console.log('Got Error ' + e.message);
    });
    req.on('end', function() {
        var buf = new Buffer(total)
            cur = 0;
        for (var i = 0, l = chunks.length; i < l; i++) {
            chunks[i].copy(buf, cur, 0);
            cur += chunks[i].length;
        }

        var level = 1;
        var path = "level"+level+".json";
        writeToFile(buf,path);
        res.send("Update successfull as level "+level);
    });

如果我上传带有表单的文件,这似乎有效:

function display_form(req, res) {
    res.sendHeader(200, {"Content-Type": "text/html"});
    res.write(
        '<form action="/upload" method="post" enctype="multipart/form-data">'+
        '<input type="file" name="upload-file">'+
        '<input type="submit" value="Upload">'+
        '</form>'
    );
    res.close();
}

但我需要上传 json 数据(这是动态的)。我是这样做的:

           $.ajax({
                type: "POST",
                url: "/upload",
                data: {"data": JSON.stringify(gamePack)},
                success: cb,
            });

然后似乎没有回调 req 'data' 或 'end'。那么上传文件与发布数据有何不同呢?

【问题讨论】:

  • 您查看过req.body 吗? dataend 用于数据流。 req.body 用于单个数据块

标签: ajax node.js express


【解决方案1】:

这似乎解决了我的问题:

$.ajax({
        type: "POST",
        dataType: 'json',
        url: "/upload",
        contentType:"application/jsonrequest",
        data: JSON.stringify(gamePack),
        success: cb,
});

【讨论】:

    【解决方案2】:

    POST'ing 通过XMLHttpRequest(这是 jQuery 从内部使用的)的数据不是流式传输的。整个项目将被发布到服务器,然后处理程序将触发,内容已经加载(req.body)。如果您希望将其分块发送,则必须自己实现。例如,通过使用 HTML5 FileSystem API 读取文件,自己分块,并使用 websocket 将分块数据写入服务器。我在socketio-upload 中做过类似的事情,所以你可能想调查一下。

    【讨论】:

    • 这似乎解决了我的问题: $.ajax({ type: "POST", dataType: 'json', url: "/upload", contentType:"application/jsonrequest", data: JSON.stringify(gamePack), 成功: cb, });
    猜你喜欢
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多