我已按照Symfony 3 docs实施了一个包含实体的文件上传。我的麻烦来自于保存后尝试编辑实体。我已经完成了文档注释并使用存储在DB中的文件名创建了new File()
实例,并在呈现编辑表单之前将路径设置为参数。
当我尝试提交编辑表单时出现问题。我最终为先前上传的文件FileNotFoundException
。似乎将实体的文件属性设置为new File()
实例会导致路径和md5文件名被推入数据库。我还没有找到一个全面的例子来编辑附加了上传文件的实体。
我在DB中看到的(文件的路径+文件名被插入到文件名的DB字段中)应该发生什么? 任何人都可以发现我的代码会导致我所描述的错误吗? 任何人都可以给我一个在编辑它所属的实体时替换上传文件的一般过程吗? 控制器:
public function addItemAction(Request $request, Category $category){
$directory = $this->setDirectory($category);
if($this->ensureDirectorySize($directory)){
$item = new Item();
$form = $this->createForm(ItemType::class, $item);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()){
$this->handleUpload($item, $directory, $category);
return $this->redirect($this- >generateUrl('category_show', array('id' => $category->getId(), '')));
}
}else{
$this->get('session')->getFlashBag()->add('alert', "Sorry, this category is full. No items may be added until some are removed.");
return $this->redirect($this->generateUrl('category_show', array('id' => $category->getId(), '')));
}
return $this->render('Admin:add-item.html.twig', array(
'form' => $form->createView()
));
}
public function editAction(Request $request, Item $item){
$category = $item->getCategory();
$item->setFile(new File($this->getParameter('items_directory').$category->getParent()->getId().'/'.$category->getId().'/'.$item->getFile()));
$form = $this->createForm(ItemType::class, $item);
$form->handleRequest($request);
$itemDir = $this->getParameter('items_directory').$category->getParent()->getId().'/'.$category->getId();
if($form->isSubmitted() && $form->isValid()){
$this->handleUpload($item, $itemDir, $category);
return $this->redirect($this->generateUrl('category_show', array('id' => $category->getId(), '')));
}
return $this->render('Admin:edit-item.html.twig', array(
'form' => $form->createView(), 'item'=>$item
));
}
private function handleUpload($item, $directory, $category){
/** @var Symfony\Component\HttpFoundation\File\UploadedFile $file */
$file = $item->getFile();
$ext = $file->guessExtension();
$fileName = $this->generateUniqueFileName().'.'.$ext;
$file->move($directory,$fileName);
$item->setFile($fileName);
$item->setUploadedAt(new \DateTime());
$item->setCategory($category);
$item->setType($ext);
$item->setOriginalFileName($file->getClientOriginalName());
$em = $this->getDoctrine()->getManager();
$em->persist($item);
$em->flush();
return $item;
}
答案 0 :(得分:0)
我的问题是我有一个子请求正在刷新setFile()
电话。在sessionLog中创建一个条目,使得特定的子请求不再刷新实体管理器解决了该问题。