1

Play Frameworkでは、フィールドを拒否することは可能ですか?

filledForm.reject("myField", "You are missing files");
return badRequest(myform.render(filledForm));

ページをリロードせずに?

ユーザーがファイルを選択できるファイル入力フィールドがあります。リジェクトとリロード時に、ファイルがクリアされ、エラーが表示されます。彼らが選んだファイルをそこに置いておきたい

現在の動作:フォームを送信する前:

前

送信後(エラーあり:ファイルがなくなった)

前

4

2 に答える 2

3

ファイル選択入力フィールド(つまり<input type="file" ... />)は他の入力フィールドとは異なります。サーバー側から値を事前入力することはできません。できれば、それは巨大なセキュリティホールになるでしょう(考えてみてください<input type="file" value="/etc/passwd" .. />)。サーバーでは、送信されたフォームを取得するときに、アップロードされたファイルへのフルパスを取得するのではなく、ファイルの名前と内容だけを取得します。

ファイル入力フィールドの値を本当に保持する必要がある場合は、別のルートに進む必要があります。Ajax(これを支援するためのいくつかのテクニックとライブラリについては「ajaxファイルアップロード」のグーグル)を介してフォームを送信し、ファイルが有効かどうかを示すAjax応答。


さらに明確にする:通常のHTML / HTTP postメソッド(Playフォームヘルパーが使用)では、元のページはなくなり、サーバーの応答は前のページに接続されていない新しいページになります。Playフォームヘルパーは、このページの入力フィールドに以前の値を事前入力しますが、上記で説明したように、これはファイル入力フィールドでは不可能です。

これが、ファイルをアップロードするための特別な目的のJavascriptライブラリがある理由です。フォームが主にファイルのアップロードに関係している場合は、これらを確認する必要があります。(例: http: //fineuploader.com)。サーバー側では、Ajaxクエリのターゲットは、アップロードされたファイルを処理し、成功/失敗メッセージを返す新しいアクションになります。このメッセージは、ユーザーに表示されます。

于 2012-09-30T08:41:11.290 に答える
3

サーバーがファイルフィールドの値を操作できる場合、ユーザーのハードドライブから任意のファイルを取得できるため、これは大きなセキュリティリスクになります。あなたが持っている2つの要件を見ると、

  • サーバー上のファイルの内容を取得する
  • クライアントUIの状態を乱さないでください

唯一のオプションは、AJAXファイルアップローダーを使用することです。したがって、フローは次のようになります。

  • AJAXアップロードを介してファイルを送信する
  • 内容を検証する
  • 後で取得できるようにファイルを保存します
  • ステータスを送り返します(OKまたはエラー)
  • エラーにエラーを表示する
  • フォーム全体を送信したら、以前に保存したファイルを検索します

負荷を気にしない場合は、おそらく少しごまかすことができます。AJAXで検証を行ってエラーメッセージを表示し、通常の送信でファイルを再度アップロードします。

それは私たちが持っている限界に取り組むことです。

于 2012-09-30T11:06:11.643 に答える