【问题标题】:Use AngularJS to send a file inside an object使用 AngularJS 在对象内发送文件
【发布时间】:2016-03-29 18:06:57
【问题描述】:

我有一个表格来注册一个有 N 个参与者的项目。 我现在被要求添加一个字段,每个参与者必须发送他们的学校证书。
问题是,在对象中添加此字段后,我无法再将数据发送到 PHP。

我必须发送的 JSON 格式如下:

{
    "description": [STRING],
    "name": [STRING],
    "objective": [STRING],
    "participants": [NUMBER],
    "regulament": [BOOLEAN],
    "resume": [STRING],
    "users": {
        "1": {
            "born": [DATE],
            "educationCertificate": [OBJECT], // File
            "email": [STRING],
            "genre": [BOOLEAN],
            "level": [NUMBER],
            "name": [STRING],
            "neighborhood": [STRING],
            "phone": [STRING],
            "school": [STRING],
            "socialNumber": [STRING]
        },
        . . .
        "n": {
            "born": [DATE],
            "educationCertificate": [OBJECT (FILE)],
            "email": [STRING],
            "genre": [BOOLEAN],
            "level": [NUMBER],
            "name": [STRING],
            "neighborhood": [STRING],
            "phone": [STRING],
            "school": [STRING],
            "socialNumber": [STRING]
        }
    }
}

要发送文件,我的 $http 如下所示:

$http({
    method: "POST",
    url: [SCRIPT],
    headers: {
        "Content-Type": undefined
    },
    data: $scope.data,
    transformRequest: function (data) {
        var formData = new FormData();

        angular.forEach(data, function (value, key) {
            formData.append(key, value);
        });

        return formData;
    }
}).success(function(response) {
    // do something
});

在 PHP 中,这是我检索 AngularJS 发送的数据的函数:

function param() {
    $array = array();
    $request = new stdClass();

    if (count($_GET) || count($_POST) || count($_FILES)) {
        $request = json_decode(json_encode(array_merge($_GET, $_POST, $_FILES)), false);
    } else {
        $request = json_decode(file_get_contents("php://input"));
    }

    if ($request) {
        $array = array_filter(array_map(function($data) {
            return is_string($data) ? trim($data) : $data;
        }, get_object_vars($request)), function($data) {
            return is_string($data) ? strlen($data) : $data;
        });
    }

    return json_decode(json_encode($array), false);
}

/* In the script */
$request = param();

然而,PHP 中传入的数据如下:

{
    "description": [STRING],
    "name": [STRING],
    "objective": [STRING],
    "participants": [NUMBER],
    "regulament": [BOOLEAN],
    "resume": [STRING],
    "users": [STRING] // "[object Object]"
}

我一直使用"Content-Type": undefined,但我尝试使用"Content-Type": "multipart/form-data""Content-Type": "application/x-www-form-urlencoded;"。但结果更糟。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 您可以使用readAsDataURL(),就像SO question 中提到的那样。还有一个Polyfill 来改进浏览器支持。

标签: php angularjs


【解决方案1】:

我最近在使用 Google App Engine(Java) 和 Servelet 时遇到了同样的问题。我的情况和你一样。用户可以在哪里上传 5 个附件,我需要上传这些文件和一些其他信息。在我的情况下 $http 不起作用。我对每个文件附件的单独请求做了什么。不是您问题的实际解决方案,但这肯定会对您有所帮助。

var formData = new FormData();
formData.append('attachment',FILE_OBJECT);  
$.ajax({
    url: "URL",
    type: "POST",
    data: formData,
    cache: false,
    contentType: false,
    processData: false,
    xhr: function() {  // Custom XMLHttpRequest
        var myXhr = $.ajaxSettings.xhr();
        return myXhr;
      },
    }).success(function( data ) {
        console.log("File uploaded successfully");
    }).error(function(data){
        console.log("Somwthing went wrong");
    });

【讨论】:

  • 我无法单独发送记录。首先我必须将项目数据保存在数据库中,然后我必须使用项目 ID 保存参与者的数据。最后,我必须生成一个包含所有数据的 PDF。如果不是 PDF,我什至可以发送单独的数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2016-09-04
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多