【问题标题】:Symfony 3 - File edit form doesn't display photo nameSymfony 3 - 文件编辑表单不显示照片名称
【发布时间】:2017-06-16 03:26:42
【问题描述】:

我在编辑具有文件的实体时遇到问题。 我按照 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) }},我将获得关于属于我的实体的照片的所有信息。

你有想法在字段中获取图像的名称吗?

谢谢!

【问题讨论】:

  • 您好,您找到解决方案了吗?我在同一点堆叠:-(
  • 实际上,我认为您无法“获取字段中图像的名称”,these reasons。您可能希望在“未选择文件”字符串下方显示图片。特别是,如果您有一个可以一次编辑多个对象的表单,那么显示不同的图片会很好。不幸的是,我不知道该怎么做。
  • 确实,令人费解的问题是为什么似乎无法显示类似 {{ form.photo.name }} 的内容,尽管很清楚如何显示 {{ dump(form.photo) }},后者也显示 photo.name。
  • 你能解决它吗?

标签: forms file upload symfony


【解决方案1】:

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

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

如果要“显示”当前文件,请添加一个自定义字段,该字段将在文件存在时显示文件名。

【讨论】:

  • “添加自定义字段”,怎么做?谢谢。
  • 如何...只需在表单中添加类似这样的内容:{% if form.photo|length &gt; 0 %}&lt;img src"{{ form.photo }}"&gt;{% endif %}
  • 谢谢,但不,我不明白。请参阅my question
【解决方案2】:

这条线似乎不正确

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

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

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

【讨论】:

  • 不,这正是docu 建议您执行的操作。您正在设置一个新文件,其中包含有关先前上传的文件的信息。这很好,因为您想呈现 edit 表单。但是,对我来说,不清楚您是如何在表单中插入该信息的。
【解决方案3】:

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

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

<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(),
    ));
}

【讨论】:

    猜你喜欢
    • 2019-08-27
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多