4

我在 Ubuntu 上使用 Symfony 1.3.2,我有一个包含多个小部件的表单。一个小部件是 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 网站上表单的安全问题:http: //www.w3.org/TR/html401/appendix/notes.html#forms-security

于 2011-02-06T00:11:46.593 回答
0

我认为您无法保存文件上传控件的状态。而且我认为你不应该。

您可以在处理表单的其余部分之前上传文件。因此,您将过程分为两部分:

  1. 文件验证
  2. 表单验证

如果表单验证失败并且用户没有尝试使用正确的信息重新提交它,那么您稍后会丢弃这些文件。这增加了一些开销,但在我看来改善了用户体验。用户可能会错误地输入错误的数据,但是当您使用适当的说明重新加载页面时,文件仍然存在。

于 2011-01-17T12:25:44.620 回答