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

「bigfile.zip」がいくつかの部分に分割され、部分ごとにサーバーに送信されることはわかっていますが、これには長い時間がかかる場合があります。では、最後の部分が送信される前に最初の部分を読むにはどうすればよいでしょうか? Apache/Nginx + PHP/Python でそれが不可能なら、node.js で別の HTTP サーバーを構築するのはどうですか?

私が見つけたいのは「ロングリクエスト」(「ロングポーリング」のような別の側面)です。ブラウザは、既存の長いリクエストを使用して、新しいリクエストを作成せずにすぐにサーバーに書き込むことができます。

なにか提案を?

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

接続: キープアライブ ?

4

2 に答える 2

0

これは、node.jsでの長期間有効なhttppostリクエストのサンプルコードです。

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を介したファイルのアップロードは少し複雑です。これが、手ごわいものを使用すると便利な場合がある理由です。

nodeを使用すると、データを取得したら、残りのデータがまだ送信されている場合でも、データを処理できる他の場所に送信し始めることができます。通常はストリームを使用します

これはそれを行う方法の例ですhttp://debuggable.com/posts/streaming-file-uploads-with-node-js:4ac094b2-b6c8-4a7f-bd07-28accbdd56cb

于 2013-02-07T13:16:48.487 に答える
0

私があなたの質問を正しく読んでいれば、アップロードが実際に完了する前に、アップロード中にzipファイル内のデータの処理を開始したいと考えています。

着信バイト ストリームを取得し、特定のファイルがいつ終了するかを判断し、適切な解凍を適用できる、ある種のストリーミング zip パーサーが必要です。

zip ファイルの物理的なレイアウト

ファイル エントリの先頭に、圧縮ファイルの長さを示す 30 バイト以上のヘッダー(濃い青) があることに気付くでしょう。その長さに達するまで着信バイトを読み取ることができます。その長さになると、次のファイルのヘッダーを処理して繰り返します。

着信バイトが読み取られると、それらを解凍プログラムに渡します。Zip ファイルは多くの種類の圧縮をサポートしているため、ファイルのヘッダーで指定されたものを使用する必要があります。

最後に、デコンプレッサは、解凍されたバイトのストリームを提供します。それらをディスクに書き込むか、それらで何か他のことを行うことができます。

ノードは、ストリームの処理に非常に適しています。Apache と Nginx は、目標を達成するために必要なリクエスト サイクルの制御レベルを実際には提供しません。

于 2013-02-07T06:01:01.673 に答える