File Builder-如何跳过文件上传字段(如果为空)。 “在null上调用成员函数guessExtension()”错误

时间:2019-07-19 14:13:51

标签: symfony

m正在创建添加/编辑功能,但实际上存在验证问题。当我要更新数据时,我不知道如何跳过fileupload文件,并且我不会选择任何要上传的文件。我只想更新其他字段,并保留添加的文件。

如果我不上传任何内容,我总是在null上有guessExtension()。

我试图添加if语句阻塞代码,如果“ $ extension = $ file-> guessExtension();”是空的,但不起作用

/**
 * @Route("/panel/editarticle/{id}", name="edit_article")
 */
public function editArticle(Request $request, Article $article)
{

    $entityManager = $this->getDoctrine()->getManager();
    $form = $this->createForm(UploadFormType::class, $article);
    $form->handleRequest($request);
    if ($form->isSubmitted())
    {
        $file = $form->get('file')->getData();

            $extension = $file->guessExtension();
            if (!$extension) {

            } else {
                $fileName = sha1(random_bytes(14)).'.'.$file->$extension;

                $file->move(
                    $this->getParameter('videos_directory'),
                    $fileName
                );
            $article->setFile($fileName);
            }



        $entityManager->persist($article);
        $entityManager->flush();
        return $this->redirectToRoute('article_list');
    }



    return $this->render('article/addpost.html.twig', [
        'controller_name' => 'ArticleController',
        'article' => $article,
        'form' => $form->createView(),
    ]);
}    

即使我不会上传任何文件,我也希望表单能够成功更新。在这种情况下,之前上传的文件仍在数据库中。不需要,我不需要上传文件以使表格正常工作。

1 个答案:

答案 0 :(得分:0)

当然,因为您不能在null上使用guessExtension(),所以这是Symfony\Component\HttpFoundation\File\File

的方法

https://github.com/symfony/http-foundation/blob/master/File/File.php

所以尝试一下:

if(
    (
        $file = $form->get('file')->getData()
    ) !== null
) {
    $extension = $file->guessExtension();
    //etc ...
}

甚至更好:

if(
    (
        $file = $form->get('file')->getData()
    ) instanceof File === true
) {
    $extension = $file->guessExtension();
    //etc ...
}

但是在第二种情况下,您需要在类中添加一条use语句(您知道是Controller this还是Service):

use Symfony\Component\HttpFoundation\File\File;

...无论如何,我不确定(当然可以对此进行讨论),这是$ form-> handleRequest($ request)的最佳实践……我从不使用它。如果您只使用一种方法呈现表单,然后使用另一种方法呈现表单,则可能会更安全,首先验证请求,然后再创建实体...在这种情况下,您可以像这样获取并验证FileBag:

$files = $request->files;
if (
    $files instanceof FileBag === true and
    empty($files) === false
) {
    foreach ($files as $file)
    {
        //and here this is sure a valid file
        $extension = $file->guessExtension();
        // ...
    }
}

如果您用FileBag验证instanceof,也必须使用use语句:

use Symfony\Component\HttpFoundation\FileBag;