2015-06-10 4 views
1

Я строю REST api, используя Symfony2, FOSRestBundle и JMSSerializerBundle. У меня есть URL-адрес, который я использую для изменения аватара пользователя.Symfony2 размещение файла через REST API

/api/users/{id}/avatar.json

Я хочу послать изображение к этому URL, чтобы изменить аватар, но я получаю эту ошибку

"The form's view data is expected to be an instance of class Symfony\Component\HttpFoundation\File\File, but is a(n) string 

Вот моя форма типа

class ChangeAvatarFormType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('picture', 'file') 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\User', 
      'csrf_protection' => false, 
     )); 
    } 

    // BC for SF < 2.7 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $this->configureOptions($resolver); 
    } 

    public function getName() 
    { 
     return 'api_user_change_avatar'; 
    } 
} 

Вот мой контроллер

/** 
    * @Rest\Put("/{id}/avatar", requirements={"id" = "\d+"}) 
    * @Security("has_role('ROLE_CONTRIBUTOR')") 
    * @Rest\View 
    */ 
    public function putUserAvatarAction(Request $request, $id) 
    { 
     $userManager = $this->get('fos_user.user_manager'); 
     $user = $userManager->findUserBy(array('id' => $id)); 

     $form = $this->createForm(new ChangeAvatarFormType(), $user, array('method' => 'PUT')); 
     $form->handleRequest($request); 

     if ($form->isValid()) { 

      $userManager->updateUser($user); 

      return new Response('', 204); 
     } else { 
      return $this->view($form, 400); 
     } 
    } 

А вот моя конфигурация POSTMAN: enter image description here

Я попытался с помощью метода POST тоже вместо PUT. Файл отправляется на сервер, он появляется, когда я var_dump $_FILES Я не понимаю, почему привязка работает не так, как ожидалось.

ответ

1

Это не ваш $ user-> getPicture() Возвращает строку?
При создании формы при передаче данных она будет пытаться установить значения по умолчанию, но поле формы FileType принимает объект File.

+0

Да, вы правы, я забыл добавить '' mapapped '=> false' в formType. Он работает сейчас, спасибо – Hakim