質問

プレイフレームワークでは、フィールドを拒否することは可能です。

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

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

私はファイルの入力フィールドを持っていますユーザーはファイルを選択できます。拒否してリロードすると、ファイルがクリアされ、エラーが表示されます。私は彼らが選択したファイルがそこにあるように存在したいです

現在の動作: 送信フォームの前に:

Play

送信後(エラー付き:ファイルが消えています)

前

役に立ちましたか?

解決

ファイルの選択入力フィールド(<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を使用した検証を行い、エラーメッセージを表示し、通常の送信でファイルを再度アップロードすることができます。

      それは私たちが持っている限界を扱うことについてのすべてです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top