2011-01-28 9 views
5

node.jsでファイルをダウンロードする機能を作成しましたが、ダウンロードする前に関数がファイルサイズをチェックするルールを作成します。データ。node.jsのファイルダウンロード/要求をファイルサイズに基づいてキャンセルします。

私はレスポンスヘッダーを取得してサイズを確認しましたが、実際のデータ/ボディを転送してすべてをキャンセルする方法はわかりません。たぶんヘッダーだけを転送する方法があり、私のルールに合致すれば、ダウンロードを要求する別の要求を発することができます。

request.on('response', function(response) { 
     var filesize = response.headers['content-length']; 
     console.log("File size " + filename + ": " + filesize + " bytes."); 
     response.pause(); 
     if (filesize >= 50000) { 
      // WHAT TO PUT HERE TO CANCEL THE DOWNLOAD? 
      console.log("Download cancelled. File too big."); 
     } else { 
      response.resume(); 
     } 
     //Create file and write the data chunks to it 

ありがとう:ここ

は、私のコードの断片です。

答えて

7

HTTPプロトコル仕様9.4 HEAD

に係るヘッド方法は、サーバが応答して メッセージボディを返してはならないことを除いて を取得することと同一です。 HEAD要求に応答してHTTP ヘッダーに含まれる メタ情報 は、GET要求に応答して送信された情報 と同一である必要があります(SHOULD)。 エンティティボディに関するメタ情報の取得には、 を含めることができます。 エンティティボディ自体を転送せずに要求によって暗示されます。 このメソッドは、 ハイパーテキストリンクの有効性、 アクセシビリティ、最近の の変更をテストするためによく使用されます。

HEAD要求に対する応答は、応答 に含まれる情報は、そのリソースから先に キャッシュ済みエンティティを更新するために使用され得るという意味で キャッシュ可能であるかもしれ。 場合は、新たなフィールド値は、キャッシュ が扱わなければならない(コンテンツ長、コンテンツ-MD5、 のETagまたはLast-Modifiedの中 変化によって示されることになるよう) キャッシュされたエンティティが現在の エンティティとは異なることを示していますキャッシュエントリは無効です。

サーバーがこれに正しく応答しない場合は、運が悪いと思われますか? 次は単純にgoogle.request('HEAD'代わり


いくつかのコードgoogle.request('GET'の私は下に次の試験を使用します。 fake.jsはexpressを使ってテストする偽のサーバです。

fake.js:

var HOST = 'localhost'; 
var PORT = 3000; 
var connections = 0; 
var express = require('express'); 
var app = module.exports = express.createServer(); 

if (process.argv[2] && process.argv[3]) { 
    HOST = process.argv[2]; 
    PORT = process.argv[3]; 
} 

app.use(express.staticProvider(__dirname + '/public')); 

// to reconnect. 
app.get('/small', function(req, res) { 
    console.log(req.method); 
    if (req.method == 'HEAD') { 
     console.log('here'); 
     res.send(''); 
    } else { 
     connections++; 
     res.send('small');  
    } 
}); 

app.get('/count', function(req, res) { 
    res.send('' + connections); 
}); 

app.get('/reset', function(req, res) { 
    connections = 0; 
    res.send('reset'); 
}); 


if (!module.parent) { 
    app.listen(PORT, HOST); 
    console.log("Express server listening on port %d", app.address().port) 
} 

test.jsのhttp-クライアントから頭をテストすることです。 試験。JS:

var http = require('http'); 
var google = http.createClient(3000, 'localhost'); 
var request = google.request('HEAD', '/small', 
    {'host': 'localhost'}); 
request.end(); 
request.on('response', function (response) { 
    console.log('STATUS: ' + response.statusCode); 
    console.log('HEADERS: ' + JSON.stringify(response.headers)); 
    response.setEncoding('utf8'); 
}); 

[email protected]:~/node/stackoverflow/4832362$ curl http://localhost:3000/count 
0 

[email protected]:~/node/stackoverflow/4832362$ node test.js 
STATUS: 200 
HEADERS: {"content-type":"text/html; charset=utf-8","content-length":"0","connection":"close"} 

[email protected]:~/node/stackoverflow/4832362$ curl http://localhost:3000/count 
0 

あなたはまだ0

+0

ファンタスティックを見ることができるように!ありがとう。 – Carlosedp

+0

あなたの歓迎:P – Alfred

関連する問題