2017-10-11 43 views
0

我創建了一個上傳圖片的表單,上傳本身正在工作,但是錯誤的值被寫入數據庫。 這是在我的控制器代碼:文件上傳後symfony在數據庫中輸入錯誤的值

<?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%' 

...和聲明的變量file_directory在config.yml:

parameters: 
    locale: en 
    file_directory: '/tmp' 

現在,當我轉儲variabel $文件名,我得到的值回我預計,2d504a8e0a9daba27e7baab69dc08896.jpeg作爲一個例子,但即使我使用相同的變量來將字符串保存到我的數據庫$user->setBild($filename);,另一個值會寫入我的表中。 我的db中值的示例:/tmp/phpn7rb2i

我真的很困惑,並且非常感謝您的幫助。 希望你們中的一些人能幫助我克服這一點。

+0

你在哪裏堅持和沖洗? –

+0

您只需將文件移動到某個位置,但忘記在實體字段中添加文件名。 –

+0

看看這個http://symfony.com/doc/2.0/cookbook/doctrine/file_uploads.html,這將給你一些很好的線跟隨處理文件上傳:) – Mcsky

回答

0

在你的DefaultController你通過FileUploader得到$filename。您通過$user->setBild($filename);$filename設置爲$user,但您永遠不會將該用戶保留到數據庫中。由於您在此之後重定向,因此$filename以及$user中的值將丟失。

您需要通過實體管理器持久化數據是這樣的:

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

因爲你似乎有你的數據庫中的值,該值要麼從一開始就存在,並不會改變,或者你堅持下去在其他方面,但無論你堅持如何,這不是DefaultControllereditAction$filename的價值。

+0

它的工作^^非常感謝: )由於這個原因被卡住太久了。祝你今天愉快 – origins523

0

你需要調用持續,對實體管理器,保存新的用戶數據庫齊平,像這樣(在控制器):

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