文件上传后symfony在数据库中输入错误的值
我创建了一个上传图片的表单,上传本身正在工作,但是错误的值被写入数据库。 这是在我的控制器代码:文件上传后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
我真的很困惑,并且非常感谢您的帮助。 希望你们中的一些人能帮助我克服这一点。
在你的DefaultController
你通过FileUploader
得到$filename
。您通过$user->setBild($filename);
将$filename
设置为$user
,但您永远不会将该用户保留到数据库中。由于您在此之后重定向,因此$filename
以及$user
中的值将丢失。
您需要通过实体管理器持久化数据是这样的:
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
因为你似乎有你的数据库中的值,该值要么从一开始就存在,并不会改变,或者你坚持下去在其他方面,但无论你坚持如何,这不是DefaultController
内editAction
中$filename
的价值。
它的工作^^非常感谢: )由于这个原因被卡住太久了。祝你今天愉快 – origins523
你需要调用持续,对实体管理器,保存新的用户数据库齐平,像这样(在控制器):
$em = $this->getDoctrine()->getManager();
$user = new User();
$user->setBild($filename);
$em->persist($user);
$em->flush();
你在哪里坚持和冲洗? –
您只需将文件移动到某个位置,但忘记在实体字段中添加文件名。 –
看看这个http://symfony.com/doc/2.0/cookbook/doctrine/file_uploads.html,这将给你一些很好的线跟随处理文件上传:) – Mcsky