4

UbuntuでSymfony1.3.2を使用していますが、いくつかのウィジェットを含むフォームがあります。1つのウィジェットはsfWidgetFormInputFileで、これによりユーザーは画像を選択できます。

フォームが有効でない場合は、誤ったフィールドを修正するために、フォームをユーザーに再度提示します。

私が経験している問題は、現在、foemが(何らかの理由で)検証に失敗すると、ユーザーが指定した画像ファイルが失われることです(つまり、ユーザーはファイルを再度選択する必要があります)。

選択した画像ファイルをそのままにして(ユーザーがファイルを再度選択する必要がないように)、フォームをユーザーに再度表示するにはどうすればよいですか?

POSTされたフォームを処理するアクションでは、getFiles($ key)を呼び出し、取得した配列にインデックスを付けてファイル情報を取得し、ウィジェットのデフォルト値を設定します(以下を参照)。ただし、レンダリングされたウィジェットは空です(以前に選択したファイルへのパス名の値は保持されません。

私の(アクション)コードのスニペットは次のようになります。

$files = $request->getFiles('foobar');

if(!empty($files) && isset($files['pict_path'])){
   $pic_info = $files['pict_path'];
   $originalName =$pic_info['name'];
   $type = $pic_info['type'];
   $tempName = $pic_info['tmp_name'];
   $size = $pic_info['size'];
   $pict_file = new sfValidatedFile($originalName, $type, $tempName, $size);

   $this->form->setWidget('pict_path', new sfWidgetFormInputFile(array('default'=>$pict_file)));
}

上記の望ましい動作を正しく実装する方法を誰かが提案できますか?

4

2 に答える 2

2

入力htmlタグ(type = "file"を使用)のvalue属性は読み取り専用です。デフォルト値に設定することはできません。これにより、入力タグの値を設定することにより、ユーザーのハードドライブの任意のファイルをサーバーにアップロードできます。

ユーザーは、フォームを送信するたびに暗黙的にファイルを選択する必要があります。Tomasが提案する解決策は良いものです。ファイルを一時フォルダーに保存し、この情報をセッションに保存し(これをフォームのどこかに再度表示できるようにします)、フォームの送信が成功したら、ファイルのセッション情報をクリアして、ファイルを正しい宛先に移動します。

このページ、B.10.1 W3C Webサイトのフォームのセキュリティ問題を参照してください:http ://www.w3.org/TR/html401/appendix/notes.html#forms-security

于 2011-02-06T00:11:46.593 に答える
0

ファイル アップロード コントロールの状態を保存できないと思います。そして、私はあなたがすべきではないと思います。

フォームの残りの部分が処理される前に、ファイルをアップロードできます。したがって、プロセスを 2 つに分割します。

  1. ファイル検証
  2. フォームの検証

フォームの検証に失敗し、ユーザーが正しい情報を使用してフォームを再送信しようとしなかった場合、後でファイルを破棄します。これにより、多少のオーバーヘッドが追加されますが、私の見解ではユーザー エクスペリエンスが向上します。ユーザーは誤って間違ったデータを入力する可能性がありますが、適切な指示でページをリロードすると、ファイルはまだそこにあります。

于 2011-01-17T12:25:44.620 に答える