Разрабатываю REST API с использованием Symfony4, FOSRestBundle и Symfony/Serializer.
Отправляю POST-запрос через Postman (файл). Выводит ошибку валидации 'Please, upload the file' (поле
file
пустое) при submit.
Я создал другую форму, используя не FOSRestBundle, а Controller. То есть я вывел html-форму на странице (
$this->render()
). Заменил
$form->submit($request->request->all())
на
$form->handleRequest($request)
, остальное оставил как есть. Файл загружается.
То есть дело в
handleRequest
? Но как его использовать с json?
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\UserTypeclass 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\UserControllerclass 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)));
}
}