将表单数据从Angular 2上传到Slim PHP API

时间:2017-05-23 16:32:11

标签: javascript php angularjs json slim

我把头发拉出来了。 有没有办法在Slim PHP中解析表单数据,将数据放入数组(就像JSON一样)。我可能会遗漏一些东西,但我尝试过的所有内容都将数据踢出一个数组而无法定位表单数据。任何帮助表示赞赏。

Angular Component(在表单提交时执行):

let memory: any = new FormData();

if (this.memory_images) {
  for(var i = 0; i < this.memory_images.length; i++) {
    memory.append('memory_images', this.memory_images[i], this.memory_images[i].name);
  }
}
memory.append('memory_song', this.memory_song);
memory.append('memory_text', this.memory_text);
memory.append('memory_author', this.memory_author);
memory.append('memory_collection', this.memory_collection);

this.memoriesService.saveMemory(memory).subscribe(data => {
  console.log(data);
  // returns empty array
});

Angular memoriesService:

saveMemory(memory){
  let headers = new Headers();
  headers.append('Content-Type','multipart/form-data');
  return this.http.post('http://{{ my api route }}/api/v1/memories', memory, {headers: headers})
  .map(res => res);
}

超薄API路线:

$app->group(APIV1 . '/memories', function() {
  $this->post('', function (Request $request, Response $response, $args) {
    var_dump($request->getParsedBody());
    return $response
  });
});

组件总是返回一个空数组。有趣的是,当通过Postman提交表单数据时,数据会返回但是作为数组中的字符串(我只发送了两个参数):

array(1) {
  ["------WebKitFormBoundaryXcRTrBhJge4N7IE2
  Content-Disposition:_form-data;_name"]=>
    string(181) ""memory_author"

    Jack
    ------WebKitFormBoundaryXcRTrBhJge4N7IE2
    Content-Disposition: form-data; name="memory_collection"

    12345678
    ------WebKitFormBoundaryXcRTrBhJge4N7IE2--
   "
}

表格一直有效,直到我需要添加上传图片的功能。在此之前,我将表单输入收集到对象中并作为JSON发送到API。我的理解是因为我现在需要附加文件,我需要将提交作为表单数据发送。它是否正确?谢谢!!!

2 个答案:

答案 0 :(得分:2)

我在Angular和Slim API中面临同样的问题,现在它的工作完美地制作了这些东西

1-请勿从角度代码

发送请求中的任何标题

2-对于上传的照片您将在Slim应用程序中获得上传图片     在$ files数组中 这是将图像从angular上传到Slim API的示例

在你的component.ts

uploadimage(){
var formData = new FormData();
formData.append("image",this.image );
return this.http.post('http://Yourserver.com/UploadeFileAPI',formData)
.map(response =>response.json()).subscribe(
result=>{
console.log("image uploaded");
},
error=>{
console.log(error);
})}
应用程序中的

$app->post('/uploadphoto',function ($req,$res){
$topic_name=$req->getParsedBodyParam('any parm name');
$files=$req->getUploadedFiles();
$newimage=$files['image'];}

答案 1 :(得分:0)

从Slim的角度来看,它只是sets the parsed body to whatever is in $_POST,所以这意味着:

  • 方法不是POST
  • 内容类型类型不是application/x-www-form-urlencodedmultipart/form-data
  • 之一
  • PHP无法将发送的数据解析为数组

查看您的代码,我认为我们可以排除前两个,这意味着这意味着数据以PHP无法理解的格式发送。

看起来您正在尝试发送多个文件,所以我想您可能需要更改:

memory.append('memory_images', this.memory_images[i], this.memory_images[i].name);

为:

memory.append('memory_images[]', this.memory_images[i], this.memory_images[i].name);

(即它是一个数组,需要[]。)