Заменить загруженный файл на редактирование?: 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 так, чтобы конкретный подзапрос больше не сбрасывался, менеджер сущностей решил проблему.

Другие вопросы по тегам