【问题标题】:Process part of a POST request before it finished, is that possible?在完成之前处理部分 POST 请求,这可能吗?
【发布时间】:2013-01-22 13:12:28
【问题描述】:
curl -v -F "file=@bigfile.zip" http://server/handler

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

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

有什么建议吗?

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

连接:保持活动状态?

【问题讨论】:

    标签: php apache node.js http long-polling


    【解决方案1】:

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

    您需要某种streaming zip parser,它可以接收传入的字节流,确定特定文件何时结束,并应用适当的解压缩。

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

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

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

    Node 非常适合处理流。 Apache 和 Nginx 并没有真正为您提供实现目标所需的请求周期控制级别。

    【讨论】:

    • 很好的解决方案,感谢您的帮助。但我的目标是找到一个“长请求”解决方案,这可能非常简单。我需要的是如何从一个大的 POST 请求中读取第一部分(在它实际完成之前)。能否提供一些示例代码?
    【解决方案2】:

    这是 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

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多