Play 2.0.3でページをリロードすることなくフォームを拒否します
-
11-12-2019 - |
質問
プレイフレームワークでは、フィールドを拒否することは可能です。
filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));
.
ページを再ロードせずに?
私はファイルの入力フィールドを持っていますユーザーはファイルを選択できます。拒否してリロードすると、ファイルがクリアされ、エラーが表示されます。私は彼らが選択したファイルがそこにあるように存在したいです
現在の動作: 送信フォームの前に:
送信後(エラー付き:ファイルが消えています)
解決
ファイルの選択入力フィールド(<input type="file" ... />
)は他の入力フィールドと異なります - サーバー側から値を事前に入力することはできません。できれば(<input type="file" value="/etc/passwd" .. />
を考える)なら、大規模なセキュリティ穴があります。サーバーで、送信されたフォームが表示されたら、アップロードされたファイルへのフルパス、ファイルの名前と内容だけが表示されません。
ファイル入力フィールドの値を実際に保存する必要がある場合は、別のルートを行く必要があります。これを支援するためのテクニックやライブラリのための「Ajaxファイルのアップロード」を介してフォームを送信する必要があります。そして、ファイルが有効かどうかを示すためにAjaxレスポンスを使用します。
さらに説明:通常のHTML / HTTP POSTメソッド(再生フォームヘルパーが使用する)で、元のページがなくなり、サーバーの応答は前のページへの接続なしの新しいページです。 Play Formsヘルパーは、このページの入力フィールドに前の値を事前に入力しますが、上記のようにファイル入力フィールドが不可能です。
これが、ファイルをアップロードするための特別なJavaScriptライブラリがある理由です。フォームがファイルのアップロードを実行することに主に関係している場合は、これらを調べる必要があります。 (例えば http://fineuploader.com )。サーバー側では、AJAXクエリのターゲットはアップロードされたファイルを処理するだけで、成功/失敗メッセージを返します。その後、ユーザーに表示されます。
他のヒント
サーバがファイルフィールドの値を操作できる場合は、ユーザハードドライブからファイルを取り出すことができるので、大きなセキュリティリスクになるでしょう。あなたが持っている2つの要件を見ると、
- サーバー上のファイルの内容を取得する
- クライアントUI状態を邪魔しないでください。
唯一のオプションは、Ajaxファイルアップローダを使用することです。だからあなたの流れが今:
- Ajaxアップロードでファイルを送信する
- 内容を検証する
- 後で検索するためのファイルを保存
- ステータスを返送する(OKまたはERROR)
- エラーのエラーを表示する
- フォーム全体が送信されたら、以前に保存したファイルを調べてください
ロードを気にしないのであれば少しをチートすることができます - Ajaxを使用した検証を行い、エラーメッセージを表示し、通常の送信でファイルを再度アップロードすることができます。
それは私たちが持っている限界を扱うことについてのすべてです。