【问题标题】:Uploading form data from Angular 2 to Slim PHP API将表单数据从 Angular 2 上传到 Slim PHP API
【发布时间】:2017-05-23 16:32:10
【问题描述】:

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

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

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
});

角度记忆服务:

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);
}

Slim 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。我的理解是,因为我现在需要附加文件,所以我需要将提交作为表单数据发送。它是否正确?谢谢!!!

【问题讨论】:

  • 抱歉没理解好...所以 PHP 部分在这里造成了问题?
  • 您好,Arslan,我不完全确定出了什么问题。在我看来,有三种可能性:1. 我错误地使用了 JS FormData 对象 2. Slim 无法解析表单数据或 3. Angular 没有正确管理表单数据请求或者我没有正确使用它。

标签: javascript php angularjs json slim


【解决方案1】:

我在 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);
})}

在您的 Slim 应用中

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

【讨论】:

  • 是的!谢谢你的帮助拉米。我需要在 Angular 和 Slim 的 getUploadedFiles 函数中删除标题的组合。删除标头对 Slim 有什么作用?它是否默认为其他内容?
【解决方案2】:

从 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);

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

【讨论】:

  • 您好 Rob,感谢您的回复。我已经在上面进行了修改,但 Angular 组件仍在记录:_body:“array(0) {↵}↵”。当我通过 Postman 发送数据时,我仍然收到相同的响应(见上文)。这是 Slim 响应表单数据的预期行为吗?我会假设它将数据解析成一个数组。我怀疑这个问题有两个部分:Angular 没有正确发送表单数据(因为 Slim API 没有接收任何内容)和 Slim 没有正确解析表单数据(基于 Postman 响应)。
  • 请提供curl 命令及其显示问题的输出。
  • 非常感谢您的帮助 Rob,非常感谢。根据上面 Ramy 的建议,看起来 Slim 无法正确解析表单数据,因为在 Angular 中删除内容类型标头后,它立即适用于我的文本数据。那么这只是一个使用getUploadedFiles函数抓取文件的案例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 2014-03-06
  • 2021-06-09
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多