Symfony 3 编辑表单文件上传问题:未传新图时Image字段置空
解决Symfony编辑表单未上传图片时覆盖原有image字段的问题
我懂你现在的困扰——每次编辑课程时,只要没选新图片,原来的图片路径就会被清空成null,这确实挺闹心的。咱们来调整代码解决这个问题:
问题根源
你当前的控制器代码不管用户有没有上传新图片,都会执行图片处理和setImage()的逻辑。但如果没传图片,$image会是null,这时候不仅会触发报错(在null上调用guessExtension()),还会把原有图片路径直接覆盖掉。
修改后的控制器代码
把你的editAction改成下面这样:
public function editAction(Request $request, Cours $cour) { $em = $this->getDoctrine()->getManager(); // 先保存原有图片路径,防止后续被意外覆盖 $originalImage = $cour->getImage(); $deleteForm = $this->createDeleteForm($cour); $editForm = $this->createForm('LearnBundle\Form\CoursType', $cour); $editForm->handleRequest($request); if ($editForm->isSubmitted() && $editForm->isValid()) { // 获取表单提交的图片文件 $image = $editForm->get('image')->getData(); // 只有当确实有新文件上传时,才处理图片逻辑 if ($image instanceof UploadedFile) { $imageName = md5(uniqid()).'.'.$image->guessExtension(); $image->move($this->getParameter('images_directory'), $imageName); $cour->setImage($imageName); } else { // 没有新图片上传,恢复原有图片路径 $cour->setImage($originalImage); } $em->flush(); return $this->redirectToRoute('cours_edit', array('id' => $cour->getId())); } return $this->render('cours/edit.html.twig', array( 'cour' => $cour, 'edit_form' => $editForm->createView(), 'delete_form' => $deleteForm->createView(), )); }
关键修改说明
- 保存原有路径:在处理表单前先把当前课程的图片路径存在
$originalImage里,确保后续操作不会丢失原有数据。 - 判断上传状态:通过
instanceof UploadedFile检查是否真的有新文件上传,只有满足条件才执行图片的上传、重命名和路径更新操作。 - 恢复原有值:如果没有新文件上传,就把原有图片路径重新赋值给实体,避免被null覆盖。
内容的提问来源于stack exchange,提问作者Farouk Douglas
相关产品推荐
相关产品推荐

