文件上传后 symfony 将错误值存入 db

symfony wrong value into db after file upload

我已经创建了一个表单来上传图片并且上传本身可以正常工作,但是错误的值被写入了数据库。 这是我控制器中的代码:

<?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');
         }
}
}

服务 FileUploader 存储在 FileUploader.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;
     }
}

我也在services.yml中定义了服务:

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

...并在 config.yml:

中声明变量 file_directory
parameters:
    locale: en
    file_directory: '/tmp'

现在,当我转储变量 $filename 时,我得到了我期望的值,例如 2d504a8e0a9daba27e7baab69dc08896.jpeg,但即使我使用相同的变量来将字符串保存到我的数据库 $user->setBild($filename); 中,另一个值将写入我的 table。 我的数据库中的值示例:/tmp/phpn7rb2i

我真的很困惑,感谢任何帮助。 希望你们中的一些人能帮助我克服这个问题。

在您的 DefaultController 中,您通过 FileUploader 获得 $filename。您通过 $user->setBild($filename);$filename 设置为 $user,但您永远不会将该用户保存到您的数据库中。由于您在那之后重定向,$filename$user 中的值都丢失了。

您需要像这样通过实体管理器持久化数据:

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

因为你的数据库中似乎有一个值,这个值要么从一开始就存在并且永远不会改变,要么你在其他某个时候坚持了下来,但无论你坚持的是什么,它都不是你拥有的价值在 $filename 在你的 editAction 在你的 DefaultController.

您需要在实体管理器上调用 persist 和 flush 以将您的新用户保存到数据库,就像这样(在控制器中):

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