Php Symfony2通过REST API发布文件

Php Symfony2通过REST API发布文件,php,rest,symfony,file-upload,Php,Rest,Symfony,File Upload,我正在使用Symfony2、FOSRestBundle和JMSSerializerBundle构建一个restapi。 我有一个URL,可以用来更改用户的头像 /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

我正在使用Symfony2、FOSRestBundle和JMSSerializerBundle构建一个restapi。 我有一个URL,可以用来更改用户的头像

/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';
    }
}
这是我的邮递员配置:

我也尝试过使用POST方法,而不是PUT。 文件被发送到服务器,当I var_dump
$\u FILES
我不明白为什么绑定没有按预期工作。

您的$user->getPicture()不是在返回字符串吗?

在表单创建时,当您传递数据时,它将尝试设置默认值,但FileType表单字段只接受文件对象。

是的,您是对的,我忘记在表单类型中添加
“mapped”=>false
。现在开始工作了,谢谢
    /**
     * @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);
        }
    }