Я создаю REST API с использованием Symfony4, FOSRestBundle и Symfony / Serializer.Когда я пытаюсь отправить форму, появляется сообщение об ошибке «Пожалуйста, загрузите файл».Итак, я создал другую форму, используя Controller
вместо FOSRestController
.Также я заменил $form->submit($request->request->all())
на $form->handleRequest($request)
.И это работает!Итак, я думаю, что ошибка в $form->submit($request->request->all())
.Как загрузить файл через API, используя Symfony4 & FOSRESTBundle?
App \ Entity \ User:
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User
{
// ...
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank(message="Please, upload the file.")
* @Assert\File(maxSize="50000k", mimeTypes={ "application/pdf", "application/vnd.ms-powerpoint" })
*/
private $file;
public function getFile()
{
return $this->file;
}
public function setFile($file): self
{
$this->file = $file;
return $this;
}
// ...
}
App \ Form \ UserType
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('file', FileType::class);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => User::class,
'csrf_protection' => false
]);
}
}
App \ Controller \ UserController
class UserController extends FOSRestController
{
public function postUserAction(Request $request)
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$data = json_decode($request->request->all(), true);
$form->submit($data);
if ($form->isSubmitted() && $form->isValid()) {
$file = $user->getFile();
$fileName = $this->generateUniqueFileName().'.'.$file->guessExtension();
$file->move(
$this->getParameter('file_directory'),
$fileName
);
$user->setFile($fileName);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->handleView($this->view(['status' => 'created'], Response::HTTP_CREATED, ['Access-Control-Allow-Origin' => '*']));
}
return $this->handleView($this->view($form->getErrors(true, false)));
}
}