クライアントからクライアントへの http 経由のファイル送信を実装する方法を知っている人はいますか。これは同様の例ですが、実装方法が見つかりません: http://jetbytes.com/ 何かアイデアはありますか?
2 に答える
あなたは彼らの行動をコピーすることができると思います、それは大まかに次のとおりです。
交換の3つの部分に名前を付けましょう:送信者(ブラウザー内)、サーバー(まあ...サーバーコード)、受信者(ブラウザー内)。
- 送信者UI:ユーザーがファイルを選択します;
- 送信者:定期的に(ここでは1秒ごとに)、送信者がファイルを送信する準備ができていることを通知してサーバーを更新します。サーバーの準備ができていない間は、送信者に「準備ができていません」と応答するだけです。
- 受信者は生成されたURLを取得します;
- 送信者は(以前と同様に)サーバーを更新して、ファイルを送信する準備ができたことを通知します。今回、サーバーは「準備ができました」と応答します。
- 送信者は、ファイルをPOSTするだけです(最も単純なHTMLフォームの場合と同様)。
- サーバーはPOSTデータを(関連するヘッダーとともに)レシーバーに中継します。
- この操作には時間がかかるため、次の操作はプログレスバーの送信者側を更新するためのものです。
- 送信者は、サーバーがこれまでに取得したデータの量を定期的に(ここでは毎秒)尋ねます。サーバーは、受信した量と、最後まで期待する量に応答します。
- 送信者は進行状況バーを更新します。
- ..。
- 送信者は、サーバーがこれまでに取得したデータの量を尋ねます。サーバーはそれが行われたと答えます。
- 交換の3つの部分のルーチンを閉じます。
もちろん、改善の余地があるはずです:
- 定期的な更新は別のテクノロジーに置き換えることができます(http://en.wikipedia.org/wiki/Push_technologyを参照)。
- 転送が完了する前に中断された場合は、転送が中断された場所から続行できるようにします。
- ...他の多くの側面
実装の場合、作業の多くはクライアント側で行われ、ここで説明するすべてはjQueryを使用して実現できます。サーバーでは、2つの目標は、データの転送と送信者への応答です。「準備ができていない」、「これまでにNバイトを取得した」、「完了した」などの軽量プロトコルを自分で定義する必要があります。
あなたが提供する例は、サーバーでも機能します。データはおそらく受信側で直接ストリーミングされますが、それでもサーバーを通過します。唯一の利点は、サーバーに何ギガバイトものデータを保持する必要がないことです。
実装に興味がある場合は、Firebug を起動してNetworkタブを見てください。
ファイルを選択すると、ファイル名がサーバーに送信され、ダウンロード用の URL が返されます。
files1 http://files1.jetbytes.com/42621cb32af927558
次に、ブラウザは実際に毎秒サーバーをポーリングし、誰かがダウンロードを要求しているかどうかを尋ねます。応答が からwait 0
に変わるwait 1
と、ブラウザの Javascript はダウンロードが要求されたことを認識し、ファイルを含むフォームを POST します。
次に、サーバー側は POST データをパイプしてダウンローダに直接送信します。実装については推測するしかありませんが、Node.js がおそらく適切な選択でしょう。