文件上传后 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();
我已经创建了一个表单来上传图片并且上传本身可以正常工作,但是错误的值被写入了数据库。 这是我控制器中的代码:
<?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_directoryparameters:
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();