Заменить загруженный файл на редактирование?: Symfony3
Я реализовал загрузку файлов с помощью Entity, следуя документам Symfony 3. Моя проблема возникает из-за попытки отредактировать сущность после ее сохранения. Я сделал как примечание документов и создал new File()
экземпляр, используя имя файла, хранящееся в БД, и путь, заданный в качестве параметра, перед отображением формы редактирования.
Моя проблема возникает, когда я пытаюсь отправить форму редактирования. Я заканчиваю с FileNotFoundException
для ранее загруженного файла. Кажется, что установка атрибута файла объекта в new File()
экземпляр приводит к тому, что путь и имя файла md5'd помещаются в БД. Мне не удалось найти исчерпывающий пример для редактирования объекта с прикрепленным загруженным файлом.
Что я должен увидеть в БД (путь к файлу + имя файла, вставляемое в поле БД для имени файла), что должно происходить? Может ли кто-нибудь определить проблему с моим кодом, которая может привести к описанной мной ошибке? Может ли кто-нибудь дать мне общий процесс замены загруженного файла при редактировании объекта, которому он принадлежит? контроллер:
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;
}
1 ответ
Моя проблема заключалась в том, что у меня был подзапрос, который setFile()
вызов. Сделав запись в sessionLog так, чтобы конкретный подзапрос больше не сбрасывался, менеджер сущностей решил проблему.