【问题标题】:Symfony input fileSymfony 输入文件
【发布时间】:2018-07-25 03:47:20
【问题描述】:

所以,我目前正在进行一个使用 symfony 学习 Object PHP 的教育项目。而且,我一直坚持将文件上传到数据库......

这里是实体:

<?php

namespace MediaBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Media
 *
 * @ORM\Table(name="media", indexes={@ORM\Index(name="k_genre", columns={"genre"}), @ORM\Index(name="k_createur", columns={"createur"})})
 * @ORM\Entity(repositoryClass="MediaBundle\Repository\MediaRepository")
 */
class Media
{
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, nullable=false)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="extension", type="string", length=3, nullable=false)
     */
    private $extension;

    /**
     * @var string
     *
     * @ORM\Column(name="link", type="text", nullable=true)
     */
    private $link;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;


    private $genre;

    /**
     * @var \MediaBundle\Entity\Personne
     *
     * @ORM\ManyToOne(targetEntity="MediaBundle\Entity\Personne")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="createur", referencedColumnName="id")
     * })
     */
    private $createur;

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getExtension()
    {
        return $this->extension;
    }

    /**
     * @param string $extension
     */
    public function setExtension($extension)
    {
        $this->extension = $extension;
    }

    /**
     * @return string
     */
    public function getLink()
    {
        return $this->link;
    }

    /**
     * @param string $link
     */
    public function setLink($link)
    {
        $this->link = $link;
    }

    /**
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @param int $id
     */
    public function setId($id)
    {
        $this->id = $id;
    }

    /**
     * @return Genre
     */
    public function getGenre()
    {
        return $this->genre;
    }

    /**
     * @param Genre $genre
     */
    public function setGenre($genre)
    {
        $this->genre = $genre;
    }

    /**
     * @return Personne
     */
    public function getCreateur()
    {
        return $this->createur;
    }

    /**
     * @param Personne $createur
     */
    public function setCreateur($createur)
    {
        $this->createur = $createur;
    }

}

这是表格:

 <?php

namespace MediaBundle\Form;

use MediaBundle\Entity\Genre;
use MediaBundle\Entity\Personne;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MediaType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $uploadRequired = false;

        $builder->add('name', TextType::class, array('attr' =>
            array(
                'class' => "form-control col-8")))
            ->add('extension', TextType::class, array('attr' =>
                array(
                    'class' => "form-control col-8")))
            ->add('link', FileType::class, array('attr' =>
                array(
                    'class' => "form-control col-8",
                )))
            ->add('uploadPreview', FileType::class, array(
                'mapped' => false,
                'required' => $uploadRequired,
                'attr' => array(
                    'class' => 'form-control col-8',
                    'placeholder' => 'Aperçu du médium'
                )))
            ->add('genre', EntityType::class, array(
                'class' => Genre::class,
                'attr' => array('class' => "form-control col-8")))
            ->add('createur', EntityType::class, array(
                'class' => Personne::class,
                'attr' => array('class' => "form-control col-8")));

    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MediaBundle\Entity\Media'
        ));
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'mediabundle_media';
    }


}

还有控制器:

    <?php

namespace MediaBundle\Controller;

use MediaBundle\Entity\Media;
use MediaBundle\Form\MediaType;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Request;


class MediaController extends Controller
{


    public function indexAction()
    {
        $em = $this->getDoctrine()->getManager();

        $media = $em->getRepository('MediaBundle:Media')->findAll();

        return $this->render('@Media/admin/media/index.html.twig', array(
            'media' => $media,
        ));
    }


    public function newAction(Request $request)
    {
        $medium = new Media();
        $form = $this->createForm(MediaType::class, $medium);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($medium);
            $em->flush();

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

        return $this->render('@Media/admin/media/new.html.twig', array(
            'medium' => $medium,
            'form' => $form->createView(),
        ));
    }


    public function showAction(Media $medium)
    {
        $deleteForm = $this->createDeleteForm($medium);

        return $this->render('@Media/admin/media/show.html.twig', array(
            'medium' => $medium,
            'delete_form' => $deleteForm->createView(),
        ));
    }

    public function editAction(Request $request, Media $medium)
    {
        $deleteForm = $this->createDeleteForm($medium);
        $editForm = $this->createForm(MediaType::class, $medium);
        $editForm->handleRequest($request);

        if ($editForm->isSubmitted() && $editForm->isValid()) {
            $this->getDoctrine()->getManager()->flush();

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

        return $this->render('@Media/admin/media/edit.html.twig', array(
            'medium' => $medium,
            'edit_form' => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

    public function deleteAction(Request $request, Media $medium)
    {
        $form = $this->createDeleteForm($medium);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->remove($medium);
            $em->flush();
        }

        return $this->redirectToRoute('media_index');
    }


    private function createDeleteForm(Media $medium)
    {
        return $this->createFormBuilder()
            ->setAction($this->generateUrl('media_delete', array('id' => $medium->getId())))
            ->setMethod('DELETE')
            ->getForm()
        ;
    }
}

我必须将 2 个资产(例如图像 + 媒体文件)放在我的数据库中的同一字段中。我没有更改数据库的权利。所以,这对我来说有点复杂。

这是完整的状态:

编辑媒体实体表单,以便您可以添加 2 个文件。 媒体缩略图文件 媒体文件(音频或视频) 更改不得修改数据库 扩展字段用于存储音频或视频文件的扩展名 音频和视频中可能的扩展名(mp3,wav,ogg,mp4,ogv,...)必须存储在参数(yml)中

【问题讨论】:

    标签: php file symfony input


    【解决方案1】:

    您应该为控制器操作添加文件写入支持。在数据库中只保存图像位置,在持久化实体之前从表单对象中获取文件并将此文件移动到公共目录中的另一个位置。

    您可以阅读更多here

    我认为这段代码应该可以工作(我没有测试下面的代码):

    public function newAction(Request $request)
    {
        $medium = new Media();
        $form = $this->createForm(MediaType::class, $medium);
        $form->handleRequest($request);
    
        if ($form->isSubmitted() && $form->isValid()) {
    
            // $file stores the uploaded file
            /** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
            $file = $medium->getLink();
    
            $fileName = $this->generateUniqueFileName().'.'.$file->guessExtension();
    
            // moves the file to the directory where brochures are stored
            $file->move(
                $this->getParameter('your_directory_in_parameter'),
                $fileName
            );
    
            // updates the preview property to store the file name only
            // instead of its contents
            $medium->setLink($fileName);
    
            $em = $this->getDoctrine()->getManager();
            $em->persist($medium);
            $em->flush();
    
            return $this->redirectToRoute('media_show', array('id' => $medium->getId()));
        }
    
        return $this->render('@Media/admin/media/new.html.twig', array(
            'medium' => $medium,
            'form' => $form->createView(),
        ));
    }
    

    在视图中你可以用这种方式显示这个图像:

    <a href="{{ asset('here/your/directory' ~ medium.link) }}">Media preview</a>
    

    【讨论】:

    • 很好,我在 symfony 文档中搜索但没有找到你链接我的那个页面,非常感谢!我会尽快试试这个! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多