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(),
]);
}
即使我不会上传任何文件,我也希望表单能够成功更新。在这种情况下,之前上传的文件仍在数据库中。不需要,我不需要上传文件以使表格正常工作。
答案 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;