Angular 2 http.post FormData()向PHP上传文件

问题描述:

我有一个使用A2 CLI的项目,并且我尝试使用类型为“file”的输入标签上传文件。我的东西在整个工作流程中发挥作用,但是我无法从客户端到服务器获取文件数据。Angular 2 http.post FormData()向PHP上传文件

我有下面的代码在打字稿:

myFnc(event){ 
    let fileList: FileList = event.target.files; 
    if(fileList.length > 0) { 
     let file: File = fileList[0]; 
     console.log(file); 
     console.log(file.name); 
     let formData:FormData = new FormData(); 
     formData.append('uploadFile', file, file.name); 
     let headers = new Headers(); 
     /* 
      this was the culprit: 
      headers.append('Content-Type', 'multipart/form-data'); 
      worked for me by changing it to: 
     */ 
      headers.append('enctype', 'multipart/form-data'); 
     headers.append('Accept', 'application/json'); 
     let options = new RequestOptions({ headers: headers }); 
     console.log(formData); 
     console.log(options); 
     this.http.post('./assets/data/upload-persona-document.service.php', formData, options) 
      .map(res => res.json()) 
      .catch(error => Observable.throw(error)) 
      .subscribe(
       data =>{ 
        console.log(data); 
       }, 
       error =>{ 
        console.log(error); 
       } 
      ) 
    } 
} 

我没有得到任何错误,让我检查在控制台的结果。 (我知道console.log(formData)实际上不会输出formData的内容,我试过.entries(),但是我已经读过FormData方法在TS中不被很好的支持)。

在upload-人物-document.service.php:

<?php 
    $target_dir = "../docs/Personas/"; 
    $json = array(); 
    $postData = file_get_contents("php://input"); 
    $input = json_decode($postData); 
    $json['input'] = $input; 
    $json['post'] = ($_POST); 
    $json['files'] = $_FILES; 
    $target_file = $target_dir . basename($_FILES["uploadFile"]["name"]); 
    $uploadOk = 1; 
    $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); 
    echo json_encode($json); 
    // ...a bunch of code that will act on the data when I can finally get it correctly... 

当我返回响应,我得到:

[Log] {input: null, post: [], files: []} (main.bundle.js, line 1117) 

我在我缺少什么,我难住了。

所以更多的挖掘和实验后,事实证明,我不得不改变在Content-Type的headers.append()线ENCTYPE以上(更新该位。)

+1

您可以发布您完全的.ts码。 –