Symfony 3 - 文件编辑表单不显示照片名称

时间:2017-01-30 20:35:53

标签: forms file upload symfony

我在编辑具有文件的实体时遇到问题。 我按照Symfony文档上传文件,它工作正常。 在创建时,我的文件存储在我的上传文件夹中,加密的名称存储在数据库中。

对于我遵循文档的版本,以便没有任何错误,我引用:

  

创建表单以编辑已经存在的项目时,文件表单类型仍然需要File实例。由于持久化实体现在只包含相对文件路径,因此首先必须将配置的上载路径与存储的文件名连接起来并创建一个新的File类

它有效。

但是在表单显示中,文件字段显示"未选择文件"

这是我的控制器:

public function editAction(Request $request, Produits $entity)
    {
        $entity->setPhoto(
            new File($this->getParameter('images_directory').'/'.$entity->getPhoto())
        );
        $form = $this->createForm('ProjectBundle\Form\Produit\ProduitType', $entity);

        $form->handleRequest($request);
        if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($entity);
                $em->flush();

                $this->addFlash('success', 'Le produit "'.$entity.'" a été modifié.');

                return $this->redirectToRoute('produit_show', array('id' => $entity->getId()));
            }
        } elseif ($form->isSubmitted()) {
            $this->addFlash('error', 'Le produit "'.$entity.'" n\'a pas pu être modifié.');
        }

        return $this->render('ProjectBundle:admin/Produit:edit.html.twig', array(
            'entity' => $entity,
            'form' => $form->createView(),
        ));
    }

在我看来:

<div class="input-field{% if form.photo.vars.errors|length %} has-error{% endif %}">
    {{ form_widget(form.photo,{'attr': {'class': 'form-control'}}) }}
    {{ form_errors(form.photo) }}
</div>

如果我执行了{{ dump(form.photo) }},我会获得有关属于我的实体的照片的所有信息。

您是否有想法在该字段中获取图像的名称?

谢谢!

3 个答案:

答案 0 :(得分:0)

这是最符合逻辑的行为......

在将文件发送到服务器之前,fileType输入中显示的文件是本地文件(来自您的计算机)。

如果你想&#34;显示&#34;在当前文件中,添加一个自定义字段,该字段将显示存在的文件名。

答案 1 :(得分:0)

此行似乎不正确

    $entity->setPhoto(
        new File($this->getParameter('images_directory').'/'.$entity->getPhoto())
    );

如果您正在调用$ entity-&gt; getPhoto(),则表示文件已存在,但您要为该实体设置新文件。我的想法是找不到文件,因此没有显示名称。

如果您添加了FormType和Model,则可能有助于确定问题。

答案 2 :(得分:0)

我已经做了一个工作量来解决这个问题,我无法设法在编辑表单中传递文件,所以我显示当前图像,以防用户不上传新的一个保存旧的。

我有一个陆军实体,在我的树枝上我用

来调用图像
<img style="max-width:128px" src={{ asset('uploads/army/' ~ army.image.filename) }}>

和控制器中的编辑功能。

   public function editAction(Request $request, Army $army)
{
    $army->setImage(new File($this->getParameter('army_directory') . '/' . $army->getImage()));
    $imgOri = basename($army->getImage());
    $deleteForm = $this->createDeleteForm($army);
    $editForm = $this->createForm('ArmyDataBundle\Form\ArmyType', $army);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {

        if ($army->getImage()) {
            // $file stores the uploaded PDF file
            /** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
            $file = $army->getImage();

            // Generate a unique name for the file before saving it
            $fileName = md5(uniqid()) . '.' . $file->guessExtension();

            // Move the file to the directory where army are stored
            $imgRoute = $this->container->getParameter('army_directory');
            $file->move(
                $imgRoute,
                $fileName
            );
            $army->setImage($fileName);
        } else {

            $army->setImage($imgOri);
        }
        $this->getDoctrine()->getManager()->persist($army);
        $this->getDoctrine()->getManager()->flush($army);

        return $this->redirectToRoute('army_show', array('id' => $army->getId()));
    }

    return $this->render('@ArmyData/Army/edit_army.html.twig', array(
        'army' => $army,
        'edit_form' => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}