我正在按照本文档https://symfony.com/doc/current/controller/upload_file.html中概述的步骤进行操作,以允许上传文件。它非常适合添加新项目,但是当我尝试编辑实体时,出现以下错误:
该表单的视图数据应该是Symfony \ Component \ HttpFoundation \ File \ File类的实例,但是是一个(n)字符串。您可以通过将“ data_class”选项设置为null或添加一个将a(n)字符串转换为Symfony \ Component \ HttpFoundation \ File \ File实例的视图转换器来避免此错误。
我已经尝试过类似该文章中所建议的代码,将文件夹的路径作为文件类型附加到我的update方法中的这样的实体上:
public function editAction(Request $request, Advertiser $advertiser)
{
$advertiser->setLogo(
new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);
$editForm = $this->createForm(AdvertiserType::class, $advertiser);
$editForm->handleRequest($request);
if ($editForm->isSubmitted() && $editForm->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('advertiser_list');
}
return $this->render('advertiser/index.html.twig', [
'form' => $editForm->createView()
]);
}
正确定义了logo_directory参数(并且可以很好地用于创建新实体)。
如果您有任何想法,请让我知道我在做什么错。
感谢您的帮助。
更新:在本文The form's view data is expected to be an instance of class ... but is a(n) string中,提出了一种建议的解决方案,该解决方案可以在表单构建器代码中包含以下内容:
->add('file', FileType::class, array('data_class' => null))
所以我现在正在执行此操作,编辑表单将显示-但它不会随先前的选择而变化。
->add('logo', FileType::class, array('data_class' => null), ['label' => 'Logo (JPG or PNG file)'])
是否有任何想法可以更改以允许表格显示预先填充的先前选择?
答案 0 :(得分:1)
设置空data_class
将删除警告,但它不起作用,此时您不需要它。
这是由于以下事实:文件一旦持久保存,数据库中剩余的只是路径,而不是文件本身(位于磁盘上的 );
如果要再次编辑该实体,则必须将路径(字符串)再次转换为 File 实体;这就是错误消息的内容。
..这就是您编写时所做的:
$advertiser->setLogo(
new File($this->getParameter('logo_directory') .'/' . $advertiser->getLogo())
);
现在,仍然存在的问题是您要预填充文件字段。实际上,这是不可能的,因为文件字段指向您自己计算机中的某个位置,而不是服务器中的文件(,并且您无法自动从某人的计算机上载类似的东西,这将非常危险< / em>)。
您想要做的可能是表明文件已存储,获取其路径并可能将其显示给您的用户。
因此在您的Twig模板中,是这样的(更改您的真实徽标目录):
{% if form.logo.vars.data %}
<img src="{{ asset('/uploads/logos_directory/' ~ form.logo.vars.data.filename) }}"/>
{% endif %}
希望很清楚。