所以我正在做一个上传大量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'的回调。那么上传文件与发布数据有何不同?
答案 0 :(得分:1)
这似乎解决了我的问题:
$.ajax({
type: "POST",
dataType: 'json',
url: "/upload",
contentType:"application/jsonrequest",
data: JSON.stringify(gamePack),
success: cb,
});
答案 1 :(得分:0)
POST
通过XMLHttpRequest
(jQuery在内部使用的数据)提供的数据不是流媒体。整个项目将发布到服务器,然后处理程序将触发,内容已加载(在req.body
中)。如果你想将它发送到chunked,那么你必须自己实现它。例如,通过使用HTML5 FileSystem API来读取文件,自己对其进行分块,并使用websocket将分块数据写入服务器。我在socketio-upload中做过类似的事情,所以你可能想看一下。