Я работаю над формой, которая принимает пользовательский ввод и файл изображения, часть представления и данные, вводимые в базу данных, работают нормально, но я застрял в том, как назвать файл после его загрузки, сейчас это то, что я вижу как имя изображения в базе данных 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;
}
Эта тема из документации может помочь вам: http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html
Кроме того, вы не должны помещать функцию загрузки в контроллер, а использовать события Doctrine (обратные вызовы жизненного цикла) для автоматического вызова вашей функции.
по предложению @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();