2012-08-23 34 views
8

Requestを使用してファイルをアップロードしています。アップロードの進行状況 - リクエスト

req = request.post url: "http://foo.com", body: fileAsBuffer, (err, res, body) -> 
    console.log "Uploaded!" 

実際にアップロードされたデータの量はどのように確認できますか?購読することができますか、または私が投票できるrequestの財産がありますか?

もし存在しなければ、データをアップロードしてどれくらいアップロードされたのかを知るにはどうすればよいでしょうか?

答えて

6

私のもう一つのプロジェクトのためのアップロードの進捗状況のハンドルが必要でした。

私が知ったのは、requestconnection._bytesDispatchedプロパティをポーリングできることです。例えば

r = request.post url: "http://foo.com", body: fileAsBuffer 
setInterval (-> console.log "Uploaded: #{r.req.connection._bytesDispatched}"), 250 

:あなたはrへの配管された場合は、代わりにr.req.connection.socket._bytesDispatchedをポーリングします。

+0

非常にいいです、ありがとう! – darma

+2

これも探しています。内部API(将来の 'nodejs'バージョンの変更が予想される)のように見えますが、それは唯一の解決策であるようです。 –

+2

これは痛いです。これは唯一のNode.jsソリューションですか?真剣に、なぜNode.jsのHTTP APIへのファイルアップロードの問題がまだ解決されていないのですか? – Sukima

-1

誰かがtransloaditのプロダクションスタックで実行していたこれを達成するための素敵なモジュールを作成しました。あなたはここでそれを見つけることができます。コードは次のようになります

https://github.com/felixge/node-formidable

var formidable = require('formidable'), 
    http = require('http'), 

    util = require('util'); 

http.createServer(function(req, res) { 
    if (req.url == '/upload' && req.method.toLowerCase() == 'post') { 
    // parse a file upload 
    var form = new formidable.IncomingForm(); 
    form.parse(req, function(err, fields, files) { 
     res.writeHead(200, {'content-type': 'text/plain'}); 
     res.write('received upload:\n\n'); 
     res.end(util.inspect({fields: fields, files: files})); 
    }); 
    return; 
    } 

    // show a file upload form 
    res.writeHead(200, {'content-type': 'text/html'}); 
    res.end(
    '<form action="/upload" enctype="multipart/form-data" method="post">'+ 
    '<input type="text" name="title"><br>'+ 
    '<input type="file" name="upload" multiple="multiple"><br>'+ 
    '<input type="submit" value="Upload">'+ 
    '</form>' 
); 
}).listen(80); 

その後、Socket.io

興味深いノートを使用して、クライアントにステータスをプッシュすることができます:これは問題の一つでしたノードの作成につながった。 this video Ryanは、ユーザーにリアルタイムで、ウェブ上でのファイルアップロードの状況を通知する最善の方法を見つけるためにノードがどのように開始されたかについて話します...とにかく私は脱走しますが、興味があれば、ノードの歴史の中で

+1

これは、ファイルを受信するためのものです。私は*別のサーバーにノードのファイルを送信しています*。 –

+4

Googleを検索するのに約4時間を費やしました。それはちょうど私だけか、または**ノードからHTTP APIにファイル**を送る世界の5人の人のようですか?合意のような感じは、Node.jsはサーバーコードにのみ役立ち、他のものには役に立たないということです。一口。 – Sukima

+0

これはあなただけではありません。私は何時間もこれについてグーグルでいますが、まだ妥当な答えは見つかりませんでした。何かを見つけましたか? – Besat

-1

は、このアプローチを試してみてください:

var file = fs.createWriteStream("largefile.jpg"); 
var totalbytes = request.headers['content-length']; 
var donesofar = 0; 

request.pipe(file); 
request.on('data', function(chunk){ 
    donesofar += chunk.length; 
    var progress = (donesofar/totalbytes) * 100; 
    response.write(parseInt(progress, 10) + "%\n"); 

}); 
3

私はrequestnodeソースで有効な何かを見つけるために数時間を費やし、そして最終的に私には、より正確な感じに異なるアプローチを見つけました。私たちは、drainイベントとbytesWritten性質に依存することができます

let size = fs.lstatSync(path).size; 
let bytes = 0; 

request.put({ 
    url: 'https://example.org/api/upload', 
    body: fs.createReadStream(path).on('data', (chunk) => { 
    console.log(bytes += chunk.length, size); 
    }) 
}); 

ストリームバッファサイズ:ファイルのバイトの進捗状況に対処する必要がある場合

request.put({ 
    url: 'https://example.org/api/upload', 
    body: fs.createReadStream(path) 
}).on('drain',() => { 
    console.log(req.req.connection.bytesWritten); 
}); 

。あるいは、それはストリームdataイベントを使用する方が簡単です65536バイトであり、読み出し/ドレイン手順は反復して実行される。

node v4.5.0request v2.74.0でこれはかなりうまくいくようです。

+1

排水方法は私のために働いた。しかし、私はファイルをpipeする必要がありましたが、bodyパラメータで渡すのではありません。私がbodyパラメーターを介して渡すと、それは複数回排出されますが、サーバーが実際にデータを受け取ったときではなく、すぐに連続して行います。それは体を介してそれを渡すことは、それが正しい経験を与えていない、バッファされているように見える。乾杯。 – McP

0
var request = require('request'); 
    var fs = require('fs'); 
    let path ="C:/path/to/file"; 
    var formData = { 
     vyapardb: fs.createReadStream(path) 
    }; 

    let size = fs.lstatSync(path).size; 

    var headers = { 
     'Accept' : 'application/json', 
     'Authorization' : 'Bearer '+token, 
    }; 

    var r = request.post({url:'http://35.12.13/file/upload', formData: formData, headers: headers}, function optionalCallback(err, httpResponse, body) { 
     clearInterval(q); 

    }); 
    var q = setInterval(function() { 
     var dispatched = r.req.connection._bytesDispatched; 
     let percent = dispatched*100/size; 
     console.dir("Uploaded: " + percent + "%"); 

    }, 250); 
} 
関連する問題