代码之家  ›  专栏  ›  技术社区  ›  origins523

上传文件后,数据库中的symfony值错误

  •  0
  • origins523  · 技术社区  · 7 年前

    我创建了一个表单来上传图像,上传本身也在工作,但错误的值被写入了数据库。

    <?php
    
    namespace AppBundle\Controller;
    
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use AppBundle\Entity\Users;
    use AppBundle\Service\FileUploader;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Symfony\Component\HttpFoundation\File\File;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\Extension\Core\Type\FileType;
    
    
    class DefaultController extends Controller
    {
     /**
         * @Route("/bearbeiten/{id}", name="edit")
         */
         public function editAction($id, Request $request, FileUploader $fileUploader){
     $user = new Users();
            //Formular wird erstellt
            $form = $this->createFormBuilder($listen)
                   ->add('bild', FileType::class, array('required'=>false, 'label'=>'Bild (JPEG-Datei)', 'data_class'=>null))
                    ->add('save', SubmitType::class, array('label'=>'Speichern', 'attr'=>array('class'=>'btn btn-primary')))
                    ->getForm();
    
            $form->handleRequest($request);
            //Falls die Form valid ist....
            if($form->isSubmitted() && $form->get('save')->isClicked()){
    
                //Daten aus der Form in Variabeln sichern
                 $file = $form['bild']->getData();
                 $filename = $fileUploader->upload($file);
                 dump($filename);
                 $user->setBild($filename);
    
                 return $this->redirectToRoute('homepage');
             }
    }
    }
    

    服务 文件上载程序 存储在 文件上传程序。php 并具有以下代码:

    <?php
    namespace AppBundle\Service;
    
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    
    
    class FileUploader
    {
         private $targetDir;
         public function __construct($targetDir) {
             $this->targetDir = $targetDir;
         }
         public function upload(UploadedFile $file) {
             $fileName = md5(uniqid()).'.'.$file->guessExtension();
             $file->move($this->getTargetDir(), $fileName);
             return $fileName;
         }
         public function getTargetDir() {
             return $this->targetDir;
         }
    }
    

    我还在中定义了服务 服务。yml公司 :

      AppBundle\Service\FileUploader:
            arguments:
               $targetDir: '%file_directory%'
    

    ...并声明了变量 文件目录 在配置中。yml:

    parameters:
        locale: en
        file_directory: '/tmp'
    

    现在当我扔掉variabel $filename ,我得到了我期望的值,2d504a8e0a9daba27e7baab69dc08896。以jpeg为例,但即使我使用相同的variabel将字符串保存到数据库中 $user->setBild($filename); my db中的值示例: /tmp/phpn7rb2i

    希望你们中的一些人能帮助我克服这个问题。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Micha    7 年前

    在你的 DefaultController 你得到了 $filename 通过 FileUploader . 你设定的 $filename $user 通过 $user->setBild($filename); 但您永远不会将该用户持久化到数据库中。由于在这之后重定向,因此 $filename 以及 $用户 都丢了。

    您需要通过实体管理器保存数据,如下所示:

    $em = $this->getDoctrine()->getManager();
    $em->persist($user);
    $em->flush();
    

    因为您的数据库中似乎有一个值,该值要么从一开始就存在并且从不更改,要么您在其他点上保持不变,但无论您坚持什么,它都不是您在数据库中拥有的值 $filename editAction 在您的 默认控制器 .

        2
  •  0
  •   Marcin Bińczyk    7 年前

    $em = $this->getDoctrine()->getManager();
    $user = new User();
    $user->setBild($filename);
    $em->persist($user);
    $em->flush();