2017-12-21 13 views
0

私は学術研究グループ向けのWebアプリケーションを作成しています。研究者は、大きなデータセット(100MB〜1GB)をCSV形式でアップロードできる必要があります。 CSVの最初の行にエラーがあると、すぐにエラーを返すことができます。クライアントが完全な要求を送信する前にWebサーバーが応答を開始できますか?

ただし、これが発生した場合、ブラウザは「接続がリセットされました」などと報告します。明らかに、私のWebサーバーは意味をなさない方法で応答しています。

ブラウザにエラーを返す前にHTTPリクエストストリーム(これはJVM上のKotlinです)を明示的に閉じると、問題はなくなります。しかし、要求ストリームの密接な実装が最初に行き、ストリーム全体を最後まで読み込むことが分かります。したがって、その時点で、ユーザーはCSVの最初の行にエラーがあることを知るために30分以上待たなければなりません。

私は何をしようとしていますか? HTTPプロトコルは、どのような状況でも、Webサーバーが完全な要求本文を送信する前に応答を開始することを許可していますか?そうでない場合は、問題があるかどうかを知る前に、ファイル全体がアップロードされるのをユーザーが待つ必要のないユーザーエクスペリエンスを提供する回避策を提案できますか?クライアントが通信の接続を開始し、サーバーが接続を閉じる場合は、サーバーが必要になり、その接続に応答することができる

Server listens for request 
Client creates request 
Client sends request to server 
Server processes request 
Server creates response 
Server sends response to client 
Client processes response 

:よう

+0

チャンク(たくさんの例があります)でアップロードしてから、各チャンクに問題がないかチェックしてください。エラーが出力されます。 –

+0

ファイルを送信するために使用しているアプリケーションに応じて、非同期要求を使用して、一度に1つの回線を送信するCSVをループすることができます。ブラウザの場合は、HTML5ファイルAPIを使用できる可能性があります。 –

+0

ありがとうございます。私は回避策に関する私の質問に答えているように感じる。これは、HTTPプロトコルが私がやっていることを許可していないと思っているのか、それともわからないのですか? –

答えて

1

答えは「はい」です.HTTP仕様によれば、サーバーは早期に応答を送信できる必要があり、クライアントは要求本文の送信を停止する必要があります。しかし、ほとんどのブラウザでは、これを正しく実装していません。

理論上、HTTPサーバーは応答本体で4xxエラーコードを返し、その後バックグラウンドでアップロードが続かないように接続をリセットする必要があります。問題の詳細な説明については、以下の回答を参照してください。これをサポートするいくつかのブラウザバージョンがあります。使用しているクライアントを制御できるラボ条件でこれを実行している場合は、以下のリンクが役立ちます。

https://stackoverflow.com/a/14483857/2274303

https://stackoverflow.com/a/18370751/2274303

[編集]

はJavaScriptを使用してアップロードをチャンキング、回避策を使用してについての質問に答えるためには、インターネット接続の問題を軽減するための良い方法ですが、あなたがしたい場合はそれをリアルタイムで解析すると、ファイルを任意に分割して簡単に処理することはできません。行の途中でファイルを分割していないことを確認する必要があります。そうしないと、データが有効であっても失敗します。これは、1GBのファイルをjavascriptで解析する問題を引き起こします。これは良いアイデアではありません。

javascriptを使用する場合は、ajaxリクエストを介してファイル全体を一度にアップロードしてください。メインのDOMの外で応答を取得し、強制的にリダイレクトまたはアップロードをキャンセルしてください。使用しているjsライブラリに応じて、これを行う方法が異なります。

これはいずれも逆のシナリオを解決しません。エラーが発生する前にファイルが95%アップロードされている場合はどうなりますか?研究者は、すべてを再度アップロードするか、ファイルを編集して、今後のエラーの行のみを含める必要があります。つまり、アプリケーションが部分的なアップロードをサポートする必要があり、途中で中断した箇所を認識する必要があります。これらのことはすべて可能ですが、これをうまく機能させるための簡単な回避策を見つけることはおそらくありません。

データセットを理解することなく、どのような検証を行っていても、完全な解決策を見つけるのは難しいです。各行の解析が以前の有効な行に依存していない場合は、ファイル全体をアップロードし、最後にエラーのある行を表示し、訂正だけで2番目のファイルをアップロードするように依頼することができます。

0

HTTP Webサーバの通常のプロセスが起こります別の接続で応答を送信する。ブラウザは、クライアントが要求しなかった新しい接続をサーバーが開始することを許可しないことがあります。

最初の行を読み、エラーをすばやく作成することで応答することはできますが、クライアントは要求の送信が完了するまで応答を読み取らない可能性があります。

ファイルをチャンク形式で送信したり、ファイルの行を非同期で送信したりすることで、フィードバックをより迅速に送信できます。間に応答する能力を備えた、より多くの小さなリクエストを送信します。

質問はHTTPプロトコルに関するものでした。カスタムアプリケーションとWebアプリケーションを作成した場合は、このプロトコルで許可されているように感じますが、ブラウザを使用している場合は、企業が実装したHTTPを使用する必要があります。カスタムアプリケーションでは、中断をチェックすることができますが、ほとんどのブラウザはおそらく応答を聞く前に完全なリクエストを発します。これはAJAXが20年前に離陸した理由です。

関連する問題