我在Ubuntu上使用Symfony 1.3.2,我有一个包含几个小部件的表单。一个小部件是sfWidgetFormInputFile,它允许用户选择图片。
如果表格无效,我会再次向用户提出,以纠正错误的字段。
我遇到的问题是,目前,当foem无法验证(无论出于何种原因)时,用户指定的图片文件将丢失(即他们必须再次选择该文件)。
如何再次向用户显示表单,所选图片文件仍然存在(所以他们不必再次选择文件)?
在处理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)));
}
有人可以建议如何正确实现上述所需的行为吗?
答案 0 :(得分:2)
输入html标记的value属性(type =“file”)是只读的。 您无法将其设置为默认值。这将允许您通过设置输入标记的值将用户硬盘驱动器的任何文件上载到您的服务器。
用户每次提交表单时都需要隐式选择文件。 Tomas提出的解决方案是一个很好的解决方案。将文件存储到临时文件夹,将此信息存储在会话中(这样您可以在某个地方再次显示此表单),并在成功提交表单后清除文件的会话信息并将文件移动到正确的目的地。
请参阅本页,B.10.1 W3C网站上表格的安全问题:http://www.w3.org/TR/html401/appendix/notes.html#forms-security
答案 1 :(得分:0)
我认为你不能保存文件上传控件的状态。我认为你不应该这样做。
您可以在处理表单的其余部分之前上传文件。因此,您将过程分为两部分:
如果表单验证失败且用户未尝试使用正确的信息重新提交表单,则稍后会丢弃这些文件。这会增加一些开销,但会改善我的视图中的用户体验。用户可能会错误地输入错误的数据,但当您使用适当的说明重新加载页面时,文件仍然存在。