【问题标题】:Symfony forms - remembering a previously selected fileSymfony 表单 - 记住以前选择的文件
【发布时间】:2011-02-16 08:24:58
【问题描述】:

我在 Ubuntu 上使用 Symfony 1.3.2,我有一个包含多个小部件的表单。一个小部件是 sfWidgetFormInputFile,它允许用户选择一张图片。

如果表单无效,我会再次将其呈现给用户,以更正错误的字段。

我遇到的问题是,目前,当 foem 无法验证(无论出于何种原因)时,用户指定的图片文件会丢失(即他们必须再次选择文件)。

我怎样才能再次向用户显示表单,而选定的图片文件仍然存在(这样他们就不必再次选择文件)?

在处理 POST 表单的操作中,我调用 getFiles($key) 然后索引检索到的数组以获取文件信息,并设置小部件的默认值(见下文)。但是,呈现的小部件是空的(不保留先前选择的文件的路径名的值。

我的(动作)代码的 sn-p 如下所示:

$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)));
}

谁能建议如何正确实现上述期望的行为?

【问题讨论】:

    标签: symfony1 symfony-forms


    【解决方案1】:

    我认为您不能保存文件上传控件的状态。而且我认为你不应该这样做。

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

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

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

    【讨论】:

      【解决方案2】:

      输入 html 标签(type="file")的 value 属性是只读的。 您不能将其设置为默认值。这将允许您通过设置输入标签的值将用户硬盘驱动器的任何文件上传到您的服务器。

      用户每次提交表单时都需要隐式选择文件。 Tomas 提出的解决方案是一个很好的解决方案。将文件存储到临时文件夹中,将此信息存储在会话中(以便您可以在表单中再次显示此信息)并在成功提交表单后清除文件的会话信息并将文件移动到正确的目的地。

      请参阅此页面,B.10.1 W3C 网站上表单的安全问题:http://www.w3.org/TR/html401/appendix/notes.html#forms-security

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 2011-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        相关资源
        最近更新 更多