nodejsはファイルのアップロードを処理します
Express4では、Req.Filesはundefinedです。現在最も使用されているものはformidableかもしれません。あなたはそれがprogressイベントを持っていることを知っているので、あなたは大喜びです。 IEの下位バージョンの進行中のバーはチャンスです。わかりました、試してみてください:
form .on( 'error'、function(err){console.log(err);})。 n = parseint(parsefloat(byteSexpected).tofixed(2)*100);はい、コンソールが予想どおり一連の進行値を印刷しているのを見てうれしいです。次に、さらに進みます。
form( 'progress'、function(bytesreceived、bytesexpected){var n = parseint(parsefloat(bytesreceived/bytesexpected).tofixed(2)*100); res.write( '<script> window.parent.call('+n+'); call方法は、ページに進行状況値を表示することです。残念ながら、最後の100%しか見ることができず、アップロードされた特定の詳細な進捗値を見ることができません。もう一度探検してください...
次に、アイデアを変更し、試してみて、 sessionの進捗値を保存し、追加のリクエストを追加して、進行状況値を投票します。ああ、それは悪くありません!要求する進捗値が、他のアップロードの進行値ではなく、今回はアップロードされるプログレス値であることを確認するために、アップロードされたリクエストと追加のリクエストでtoken値に同意する必要があります。もう1つの質問は、リクエスト時にこのtokenを取得する方法です。ファイルのアップロードのリクエスト本文はRequest Payloadにあるため、 req.bodyそれによってもたらされる値を取得できず、この山を解析したくありません。もちろん、私もそれを解析することはできません。 urlに入れるのが最善です。問題は、 tokenを更新するために2回更新する必要があることがありますが、これは良くありません。最後の手段として、私はそれをcookieに入れます!
var cookies = function(){var cks = req.headers.cookie.split( ';')、obj = {}; for(var i = 0; i <cks.length; i ++){obj [cks [i] .split( '=')[0] .replace(// s+/ig、 '')] = unescape(cks [i] .split( '=')[1]); } objを返します。 }(); var querytoken = cookies .__ token__; form .on( 'progress'、function(bytesreceived、bytesexpected){var n = parseint(forme.bytesreceived/form.bytesexpected).tofixed(2)*100); if(req.session ['file'+querytoken]){req。 req.session ['file'+querytoken] = {querytoken、n}};IE789の場合、私は進捗値のために投票に来ました。私は私を許しますが、私の心は痛いです。
var getData = function(){$ .post( '/uploader'、{getFileInfo:1、uploadToken:utils.cookie.getCookie( '__ token__')})。 call(pro.percent!= '100'); } getData(); call方法は、ページに進行状況値を表示することです。残念ながら、最後の100%しか見ることができず、アップロードされた特定の詳細な進捗値を見ることができません。もう一度探検してください...
さて、私は再びそれに陥りました。しかし、私はまだ何かが間違っていると感じています。AjaxPollingに問題はありません。問題は、 sessionが値がある前にアップロードが完了するまで待たなければならないため、100%しか表示されず、詳細な進捗値が表示されないことです。進行中は、以前のres.writeとこのreq.session停止されたと思いますが、 progressが解放されるまで各実行の結果を保存するため、100%しか見えません。私はformidableソースコードを読む気分ではありません。もちろん、私はそれを理解することができないので、私は最初にそう思います!
ajax Pollingは問題ないため、 sessionに保存するのは簡単ではありません。実際に機能しない場合は、 globalで試してみてください。グローバルオブジェクトに値を詰めることができず、ハングします。それがわずかな変更を加えると、それはglobalに入れられます:
form .on( 'Progress'、function(bytesreceived、bytesexpected){var n = parseint(forme.bytessreceived/form.bytesexpected).tofixed(2)*100);グローバル['file'+querytoken] = {querytoken、n}};投票を続けます。
美しい、それだけです! Chromeで見られるものはHTML5の進行状況と同じですが、IE789で少し立ち往生していると感じますが、詳細な進行値を見ることができます。結局のところ、古いブラウザは良くありません。そして、アップロードするたびに、価値をglobalに入れるので、適切にクリーンアップする必要があります。ファイルがアップロードされたら、指定されたディレクトリglobal['file'+queryToken]=nullに転送できます。
ただし、ポーリングとは次々と多くの要求を意味し、ここに問題がある可能性があります。制限しない場合、500ms間隔ごとに進捗値が要求されます。さて、IE789 Progress Barはこのように解決され、フラッシュを捨てることが合意されています。このポーリングはすべてのブラウザと互換性がありますが、それでも非常に多くのリクエストの無駄です。判断しましょう。IE789以外でHTML5を続けてください!
実際、それを測定すると、どれがより価値があり、1つのフラッシュアップロードまたは追加のリクエストがありますか?フラッシュを理解していないことを許してください、私はあまり言いません。とにかく、ページに追加のファイルを追加するのは好きではありません。
要約します
ファイルアップロードコンポーネントに関する詳細はまだたくさんあります。私はもともとJSファイルを作成したかったのですが、後で、より再利用可能になるためには、独立したページとしてそれを行う方が良いと思いました。アップロードする必要がある場合は、iframeを作成するだけです。これは、JSファイルを作成するよりもはるかに優れています。上記は、この記事のコンテンツ全体です。私はそれがあなたの勉強や仕事であなたを助けることができることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。