Symfony формы - запоминание ранее выбранного файла - PullRequest
4 голосов
/ 06 мая 2010

Я использую Symfony 1.3.2 в Ubuntu, и у меня есть форма, которая содержит несколько виджетов. Одним из виджетов является sfWidgetFormInputFile, который позволяет пользователю выбирать изображение.

Если форма недействительна, я снова представляю ее пользователю, чтобы исправить ошибочные поля.

Проблема, с которой я сталкиваюсь, заключается в том, что в настоящее время, когда программа не проверяет (по какой-либо причине), файл изображения, указанный пользователем, теряется (то есть ему приходится снова выбирать файл).

Как я могу снова показать форму пользователю, с выбранным файлом изображения, который все еще там (так что ему не нужно снова выбирать файл)?

В своем действии, которое обрабатывает форму POSTed, я вызываю 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)));
}

Может кто-нибудь подсказать, как правильно реализовать желаемое поведение, описанное выше?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Атрибут value входного HTML-тега (с type = "file") доступен только для чтения. Вы не можете установить его на значение по умолчанию. Это позволит вам загрузить любой файл с жесткого диска пользователя на ваш сервер, установив значение входного тега.

Пользователь должен неявно выбирать файл каждый раз, когда он / она отправляет форму. Томас предлагает хорошее решение. Сохраните файл во временной папке, сохраните эту информацию в сеансе (чтобы вы могли где-то снова показать ее в своей форме), и после успешной отправки формы очистите информацию о сеансе для файла и переместите файл в нужное место назначения.

См. Эту страницу, B.10.1 Проблемы безопасности для форм на веб-сайте W3C: http://www.w3.org/TR/html401/appendix/notes.html#forms-security

0 голосов
/ 17 января 2011

Не думаю, что вы можете сохранить состояние элемента управления загрузкой файлов. И я не думаю, что вы должны.

Вы можете загрузить файлы до обработки остальной части формы. Таким образом, вы разделили процесс на две части:

  1. Проверка файла
  2. Проверка формы

Если проверка формы завершится неудачно и пользователь не попытается повторно отправить ее, используя правильную информацию, вы позже удалите файлы. Это добавляет некоторые накладные расходы, но улучшает пользовательский опыт, на мой взгляд. Пользователь может ошибочно ввести неправильные данные, но при перезагрузке страницы с соответствующими инструкциями файлы все еще там.

...