0
curl -v -F "file=@bigfile.zip" http://server/handler

我知道“bigfile.zip”将被分成几个部分并逐部分发送到服务器,这可能需要很长时间。那么我怎么能在最后一部分发送之前阅读第一部分呢?如果 Apache/Nginx + PHP/Python 无法做到这一点,那么使用 node.js 构建另一个 HTTP 服务器怎么样?

我想找到的是一个“长请求”(另一边,如“长轮询”)。浏览器可以通过使用存在的长请求立即写入服务器,而无需创建新请求。

有什么建议吗?

==================

连接:保持活动?

4

2 回答 2

0

如果我正确阅读了您的问题,您希望在上传时开始处理 zip 文件中的数据,然后再上传实际完成。

您需要某种流式 zip 解析器,它可以获取传入的字节流,确定特定文件何时结束,并应用适当的解压缩。

zip 文件的物理布局

您会注意到,在文件条目的开头,有一个 30+ 字节的标题(深蓝色)会告诉您压缩文件的长度。您可以读取传入的字节,直到达到该长度,此时您处理下一个文件的标题并重复。

在读取传入字节时,您将它们交给解压缩器。Zip 文件支持多种类型的压缩,因此您必须使用文件头指定的一种。

最后,你的解压器会给你一个解压字节流。您可以将它们写入磁盘或对它们执行其他操作。

Node 非常适合处理流。Apache 和 Nginx 并没有真正让您对实现目标所需的请求周期进行控制。

于 2013-02-07T06:01:01.673 回答
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 上传文件稍微复杂一些。这就是为什么使用类似强大的东西会很有用的原因。

使用节点,一旦您获得数据,您就可以开始将其发送到可以处理它们的其他地方,即使其余数据仍在到来。通常你会使用流

这是一个如何做到这一点的例子http://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb

于 2013-02-07T13:16:48.487 回答