Symfony2 通过 REST 发布文件 API
Symfony2 posting a file through REST API
我正在使用 Symfony2、FOSRestBundle 和 JMSSerializerBundle 构建 REST api。
我有一个 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';
}
}
这是我的控制器
/**
* @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 配置:
我也尝试过使用 POST 方法,而不是 PUT。
文件发送到服务器,当我var_dump$_FILES
出现
我不明白为什么绑定没有按预期工作。
你的 $user->getPicture() 返回的不是字符串吗?
在创建表单时传递数据时,它会尝试设置默认值,但 FileType 表单字段只接受文件对象。
我正在使用 Symfony2、FOSRestBundle 和 JMSSerializerBundle 构建 REST api。 我有一个 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';
}
}
这是我的控制器
/**
* @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 配置:
我也尝试过使用 POST 方法,而不是 PUT。
文件发送到服务器,当我var_dump$_FILES
出现
我不明白为什么绑定没有按预期工作。
你的 $user->getPicture() 返回的不是字符串吗?
在创建表单时传递数据时,它会尝试设置默认值,但 FileType 表单字段只接受文件对象。