curl -v -F "file=@bigfile.zip" http://server/handler
我知道“bigfile.zip”将被拆分为几个部分并逐个发送到服务器,这可能需要很长时间。那么我怎样才能在最后一部分发送之前阅读第一部分?如果使用Apache / Nginx + PHP / Python这是不可能的,那么用node.js构建另一个HTTP服务器呢?
我想要找到的是“长期请求”(另一方面,如“长期投票”)。浏览器可以使用存在的长请求立即写入服务器,而无需创建新的请求。
有什么建议吗?
=================
连接:保持活力?
答案 0 :(得分:0)
如果我正确地阅读了您的问题,您希望在上传实际完成之前,在上传zip文件时开始处理数据。
您需要某种streaming zip parser来获取传入的字节流,确定特定文件何时结束,并应用适当的解压缩。
您会注意到,在文件条目的开头,有一个30+字节header(深蓝色),它会告诉您压缩文件的长度。您可以读取传入的字节,直到达到该长度,此时您将处理下一个文件的标题并重复。
当读取传入的字节时,您将它们移交给解压缩器。 Zip文件支持多种类型的压缩,因此您必须使用文件头部指定的压缩文件。
最后,您的解压缩程序将为您提供解压缩的字节流。您可以将它们写入磁盘或使用它们执行其他操作。
Node非常适合处理流。 Apache和Nginx并没有真正为您提供实现目标所需的请求周期控制权。
答案 1 :(得分:0)
这是node.js
中长期存在的http post请求的示例代码var http = require('http');
var server = http.createServer(function(req, res) {
if(req.method == 'POST' && req.url == '/handler') {
req.on('data', function(data) {
// i'm getting chunks of data in here !
});
req.on('end', function() {
res.writeHead(200, 'OK');
res.end('Got your file\n');
});
}
else {
res.writeHead(404, 'Not Found');
res.end();
}
});
server.listen(80);
当然这是最基本的例子,通过http上传的文件稍微复杂一些。这就是使用formidable这样的东西有用的原因。
使用节点,一旦获得数据,您就可以开始将数据发送到可以处理数据的其他地方,即使其他数据仍然存在。通常你会使用流
这是如何执行此操作的示例http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb