присвоение имени файлу после отправки формы в Symfony

Я работаю над формой, которая принимает пользовательский ввод и файл изображения, часть представления и данные, вводимые в базу данных, работают нормально, но я застрял в том, как назвать файл после его загрузки, сейчас это то, что я вижу как имя изображения в базе данных C:\wamp2.5\tmp\phpF360.tmp что явно не правильно.

Вот так выглядит мой контроллер DefaultController.php

public function createBlogAction(Request $request)
{

$post = new Post();
$form = $this->createForm(new PostCreate(), $post);
$form->handleRequest($request);

if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$post->upload();
$post->setDate(date_create(date('Y-m-d H:i:s')));
$post->setAuthor('ClickTeck');
$em->persist($post);
$em->flush();

$this->get('session')->getFlashBag()->add(
'notice',
'Success'
);
}

return $this->render('BlogBundle:Default:blog-create.html.twig', array(
'form' => $form->createView()
)
);
}

Это то, что мой upload() выглядит как внутри Entity/Post.php который загружает файл и перемещает его в папку, имя файла, которое я вижу в папке, является правильным, однако теперь оно входит в базу данных.

public function upload()
{
if (null === $this->getImage()) {
return;
}

// I might be wrong, but I feel it is here that i need to name the file
$this->getImage()->move(
$this->getUploadRootDir(),
$this->getImage()->getClientOriginalName()
);

$this->path = $this->getUploadDir();
$this->file = null;
}

Я буду очень признателен, если кто-то может подтолкнуть меня в правильном направлении, мне просто нужно назвать файл, имя, которое присваивается изображению в базе данных, и файл также должен быть загружен с тем же именем.


ОБНОВИТЬ

Мне удалось заставить его работать, используя следующую функцию, не уверен, что это лучшая практика, но она сработала, я хотел бы услышать об этом от других. Пожалуйста, не предоставляйте никаких ссылок, если вы можете уточнить, что уже было сделано, это было бы здорово.

public function upload()
{
// the file property can be empty if the field is not required
if (null === $this->getImage()) {
return;
}
$dirpath = $this->getUploadRootDir();
$image = $this->getImage()->getClientOriginalName();
$ext = $this->getImage()->guessExtension();
$name = substr($image, 0, - strlen($ext));
$i = 1;
while(file_exists($dirpath . '/' .  $image)) {
$image = $name . '-' . $i .'.'. $ext;
$i++;
}
$this->getImage()->move($dirpath,$image);
$this->image = $image;
$this->path = $this->getUploadDir();
$this->file = null;
}

0

Решение

Эта тема из документации может помочь вам: http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

Кроме того, вы не должны помещать функцию загрузки в контроллер, а использовать события Doctrine (обратные вызовы жизненного цикла) для автоматического вызова вашей функции.

1

Другие решения

по предложению @theofabry вы можете проверить документацию symfony2 Как обрабатывать загрузку файлов с помощью Doctrine, Контроллер должен быть максимально тонким и попытаться сделать загрузку с Doctrine Events,

Если вы хотите продолжить свою логику, вы можете попробовать следующий код, я еще не проверял … поэтому, пожалуйста, будьте осторожны.

   // set the path property to the filename where you'ved saved the file
$this->path = $this->file->getClientOriginalName();

вместо

 $this->path = $this->getUploadDir();
0

По вопросам рекламы [email protected]