2

我在使用 Symfony (Doctrine) 进行文件管理时遇到问题。关键是文件上传成功,问题是当我更新存储包含图像的字段的实体时,图像被删除

我想知道如何进行更改(而不是创建)实体并将表单中的输入文件类型留空,图像仍然存在并且没有被删除

我把我的代码留在下面。

问候和感谢。

实体:

public function getAbsolutePath()
    {
        return null === $this->getLogo()
        ? null
        : $this->getUploadRootDir().'/'.$this->getLogo();
    }

    public function getWebPath()
    {
        return null === $this->getLogo()
        ? null
        : $this->getUploadDir().'/'.$this->getLogo();
    }

    protected function getUploadRootDir()
    {
        // la ruta absoluta del directorio donde se deben
        // guardar los archivos cargados
        return __DIR__.'/../../../../web/' . $this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // se deshace del __DIR__ para no meter la pata
        // al mostrar el documento/imagen cargada en la vista.
        return 'images/agencies';
    }

    public function filename()
    {
        // Comprueba si la agencia dispone de identificador para ponerlo como nombre de logo.
        if ($this->getId() != null || $this->getId() != '')
            $filename = $this->getId() . '.' . $this->getlogo()->getClientOriginalExtension();
        else 
            $filename = $this->getlogo()->getClientOriginalName();

        // Devuelve el nombre de fichero generado.
        return $filename;
    }

    public function upload()
    {
        if (null === $this->getLogo()) 
        {
            return;
        }

        $this->getLogo()->move(
                $this->getUploadRootDir(),
                $this->filename()
        );

        //$this->logo = $this->getUploadDir().$this->getLogo()->getClientOriginalName();
        $this->logo = $this->filename();

    }

控制器

/**
     * Formulario para lo configuración de los datos de la agencia.
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function formConfigDataAction()
    {
        // Consulta los datos de la agencia.
        $em = $this->getDoctrine()->getManager();
        $agency = $em->getRepository('PanelBundle:Agencies')->find($this->getUser()->getId());

        // Crea el formulario según 'AgenciesType' pasando los datos seleccionados.
        $form = $this->createForm(new AgenciesConfigDataType(), $agency);

        // Recoge la petición.
        $request = $this->getRequest();

        // Comprueba si se han obtenidos datos mediante POST.
        if ($request->getMethod() == 'POST')
        {
            // Asocia el formulario con los datos de la petición.
            $form->handleRequest($request);

            // Comprueba si los datos recibidos son válidos.
            if ($form->isValid())
            {
                // Sube la imagen
                $agency->upload();

                // Almacena los cambios.
                $em->flush();

                // Genera la alerta.
                $this->addFlash(
                        'success',
                        'Se ha guardado la nueva configuración.'
                );
            }
            else
            {
                // Genera la alerta.
                $this->addFlash(
                    'danger',
                    'Existen campos no válidos. Comprueba los datos introducidos.'
                );
             }

             // Redirige al usuario.
             return $this->redirect($this->generateUrl('agencies_form_config_data'));
        }

        // Renderiza la vista.
        return $this->render('PanelBundle:Agencies:form-config-data.html.twig', array(
                'form' => $form->createView(),
                'logo' => $agency->getLogo()
        ));
    }

看法

    <div class="form-group col-lg-6">
        {{ form_label(form.logo, 'Subir nuevo logotipo') }}
        {{ form_widget(form.logo) }}
        {{ form_errors(form.logo) }}
        <span class="help-block">Recomendamos un tamaño no superior a 400px x 250px</span>
    </div>
4

1 回答 1

-1

文件上传过程在文档中已经很好地解释了,您不必upload在每个操作中都调用方法,使用生命周期回调,如here所述。

于 2015-05-19T12:10:17.257 回答