在Symfony中提交表单后命名文件

时间:2014-10-01 10:23:10

标签: php forms symfony symfony-2.5

我正在处理一个接受一些用户输入和一个图像文件的表单,提交部分和输入到数据库中的数据工作正常但是我仍然坚持如何在文件上传后命名文件,现在这就是我在数据库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;
}

2 个答案:

答案 0 :(得分:1)

文档中的这个主题可以帮助您:http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html

此外,您不应将上传功能放在控制器中,而应使用Doctrine事件(Lifecycle回调)自动调用您的功能。

答案 1 :(得分:0)

根据@theofabry的建议,您可以查看symfony2文档How to handle File Uploads with Doctrine,Controller必须尽可能精简并尝试使用Doctrine Events上传。

如果您想继续使用逻辑,可以尝试使用代码,我还没有测试过......所以请小心。

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

而不是

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