繁体   English   中英

替换在编辑时上传的文件?:Symfony3

[英]Replace file uploaded on edit?: Symfony3

按照Symfony 3 docs的要求 ,我已经使用Entity实现了文件上传。 我的麻烦来自试图在实体保存后对其进行编辑。 我已经完成了文档说明,并在呈现编辑表单之前使用存储在数据库中的文件名和设置为参数的路径创建了一个new File()实例。

当我尝试提交编辑表单时,出现了麻烦。 我最终得到了先前上传文件的FileNotFoundException 似乎将实体的文件属性设置为new File()实例会导致将路径和md5文件名推送到数据库中。 我还没有找到一个完整的示例来编辑带有已上传文件的实体。

我在数据库中看到的是什么(文件的路径+插入到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;
}

我的问题是我有一个子请求正在刷新setFile()调用。 在sessionLog中进行输入,以使特定的子请求不再刷新,实体管理器解决了该问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM