2009-06-24 19 views
16

これは少しの質問のように思えるかもしれませんが、私が知っている多くのWeb開発者は完全な理解を持っていません。HTTPとファイルのアップロード - どのように実際に(フードの下で)

FileUploadコントロールのアップロードされたイベントで、Webページファイル入力ボックスからWebサーバー(たとえば.netサイトをホストする)にファイルをアップロードするにはどうすればよいですか?

私の理解では、ストリームを要求するサーバーにポストが作成され、その後、ブラウザーに戻され、サーバーへのデータのストリーミングが開始されました。

私の友人は、ファイル全体がブラウザの投稿要求にエンコードされていて、(大量の)投稿がサーバーに送信されていると言っています。

私はこのようなケースではないと思っていました。サーバー全体が投稿を受け取ってから、その時点までに何かを行うことができなくなるまで、Ajaxプログレスバーを構築する方法はありませんファイルをディスクに保存するだけです。

実際にブラウザからサーバーまではどのように機能しますか?

+2

これは有効な質問です。 +1 – samoz

答えて

9

あなたの友人は正しいです。 AJAXプログレスバーが必要な場合は、いくつかのフープをジャンプする必要があります。

通常、この手法は、サーバー上の進行状況をサーバー上のIHttpHandlerにアップロードすることです。サーバー全体の辞書には、クライアントが作成したIDでキーイングされ、AJAXの進行要求とアップロード投稿。このようにして、クライアントがAJAXリクエストを行うと、そのリクエストを処理するサーバーコードは、そのディクショナリから値を読み取って、サーバーが処理したファイルPOSTバイト数を確認できます。

はい、複雑です。

+0

これは意味をなさないと思いますが、httphandlerはネットワークレベルで動作し、部分的な投稿の着信パケットを検出できることを示唆していますか? – Sheff

+1

HttpHandlerは 'ネットワークレベルで' persayでは動作しませんが、標準ページより低いレベルで作業を行うことができます。通常のページでは、POSTがサーバーに完全にロードされるまで、イベント処理コードは実行されません。 IHttpHandlerでは、到着時にデータを処理できますが、ページライフサイクルが自動的に行うすべての自動処理が失われます。 –

7

私はあなたの友人が正しいと思う、ファイルは、サーバーに送信されたポストにエンコードされます。実際の動作を正確に確認したい場合は、FirefoxでTamper Dataを使用して実際の投稿データを表示してみてください。

ETA:あなたは、サーバー側のアップロードの進行状況を確認するためにAJAX要求を使用して、非表示のiframe内にポストを実行して作業を言及

AJAXスタイルのアップロード。

+0

OK私の仲間は私がかなり確信していると言っていますが、確かにhttphandlerは何かをする前に投稿を受け取らなければなりませんか?とにかくこの時間までには投稿全体があります。またはhttphandlerがネットワークレベルで動作し、パケットをインターセプトしてさらに説明できますか? – Sheff

+1

一部のサーバーでは、ヘッダーが読み取られた後、データが読み取られる前に要求の処理を開始できます。私が使ったフレームワークの中には、リクエストの本文をストリームとして与えるものがあります(ヘッダーなどを解析しない限り)。ほとんどのリクエストハンドラは、要求が完全に読み取られるまで応答を返送しません。 –

+1

あなたのhttphandlerでProcessRequest()が呼び出された時点で投稿全体がダウンロードされたのかどうかはわかりませんが、どちらか一方の方法で実際のドキュメントが見つかりませんでした。 –

関連する問題