iam开发了多个文件上传器。
要了解我的问题,我尝试为您描述一下:
我有两个具有“ 1 ... n”关系的实体(对象和图像),因此每个对象都可以具有“ n”个图像。
如果我尝试上传一些图片,我的控制器会抛出一些异常,但是我不使用图片实体。不知道如何解决此问题并获得一些可以正常工作的Uploader。
给出类型为“ App \ Entity \ Images”,“ Symfony \ Component \ HttpFoundation \ File \ UploadedFile”的预期参数。
控制器:
/**
* @Route("/new", name="objects_new", methods="GET|POST")
*/
public function new(Request $request): Response
{
$object = new Objects();
$form = $this->createForm(ObjectsType::class, $object);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$file = $form->get('logo')->getData();
$fileName = $this->generateUniqueFileName().'.'.$file->guessExtension();
$file->move(
$this->getParameter('logo_directory'),
$fileName
);
$object->setLogo($fileName);
foreach ($request->files as $uploadedFile) {
$uploadedFile = current($uploadedFile['file']);
dump($uploadedFile);
}
$em->persist($object);
$em->flush();
return $this->redirectToRoute('home');
}
return $this->render('objects/new.html.twig', [
'object' => $object,
'form' => $form->createView(),
]);
}
对象实体:
/**
* @ORM\OneToMany(targetEntity="App\Entity\Images", mappedBy="objects")
*/
private $images;
图片实体:
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Objects", inversedBy="images")
*/
private $objects;
ObjectsType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('designation')
->add('description')
->add('place')
->add('coordL', null, array(
'attr' => array('readonly' => 'true'),
))
->add('coordB', null, array(
'attr' => array('readonly' => 'true'),
))
->add('category')
->add('logo', FileType::class, array('label' => ' ', 'data_class' => null))
->add('images', FileType::class, array('label' => 'Bilder (png, jpg, jpeg)', 'data_class' => null, 'multiple' => true))
;
}
如果有人知道如何解决我的问题,请帮助我。
答案 0 :(得分:1)
您的$images
字段设置为App\Entity\Images
类型,但是在您的FormType中,您将其设置为FileType
。
这是我正在谈论的那一行:
->add('images', FileType::class, array('label' => 'Bilder (png, jpg, jpeg)', 'data_class' => null, 'multiple' => true))
从这一点出发,您有几种解决问题的方法,其中:
可以在FormType的该字段中添加“ mapped => false”选项,然后从控制器手动处理该过程(将文件转换为Image
实体)。
或进行自定义ImageFormType
映射到您的Image
实体,该实体包含您的FileType字段(尽管可能需要一些棘手的代码)
请参阅: form type mapped false symfony2 和 https://symfony.com/doc/current/form/create_custom_field_type.html以获得更多信息。