【问题标题】:Angular submit form dataAngular提交表单数据
【发布时间】:2014-11-03 17:37:13
【问题描述】:

我正在使用 ng-flow 库将图像加载到服务器,在用户拖放图像后,我可以将 HTML 5 文件图像获取到我的控制器,我需要将它与其他参数一起下载到服务器,比如货币,主题等。我用谷歌搜索,发现最好的方法是转换为 json 表单数据并使用 POST 方法发送。当我收到服务器的响应时,我看到表单数据包含主题但不包含图像。有什么问题?

以下代码中的url是真实的,你可以尝试得到你自己的响应。

角度代码:

 var file = $flow.files[0];
 $http({
            method: 'POST',
            url: "http://yuppi.com.ua/server/rest/add.php?key=453sdfg3t&action=add",            
            headers: { 'Content-Type': false },

            transformRequest: function (data) {

                 var formData = new FormData();

                 formData.append("subject",  angular.toJson(data.subject));
                 formData.append("file", data.file);

                 return formData;                
            },

            data: { subject: subject, file: file}
        }).
        success(function (data, status, headers, config) {
            alert(data);
        }).
        error(function (data, status, headers, config) {
            alert(data);
        });

PHP 代码:

$form = file_get_contents("php://input");

echo "Form: ";  print_r($form);

$_FILES 的 var_dump

"array(1) {
  ["photo"]=>
  array(5) {
    ["name"]=>
    string(14) "gradient-2.png"
    ["type"]=>
    string(9) "image/png"
    ["tmp_name"]=>
    string(14) "/tmp/phpY8nqji"
    ["error"]=>
    int(0)
    ["size"]=>
    int(442567)
  }
}

【问题讨论】:

  • PHP 中的 $_POST 变量中有什么内容?
  • @progsource 你的意思是$_FILES 对吗?因为$_POST 不会填充上传的文件。
  • $_POST 和 $_FILES 变量为空。

标签: javascript php angularjs


【解决方案1】:

您应该将表单数据发送到您的控制器,试试这个:

数据:{主题:主题,数据:formData}

您还需要首先定义 formData 以通过 $http 发送。最后试试这个:

var file = $flow.files[0]; 
var formData = new FormData();

 $http({
            method: 'POST',
            url: "http://yuppi.com.ua/server/rest/add.php?key=453sdfg3t&action=add",            
            headers: { 'Content-Type': false },

            transformRequest: function (data) {

                 formData.append("subject",  angular.toJson(data.subject));
                 formData.append("file", data.file);

                 return formData;                
            },

            data: { subject: subject, data: formData}
        }).
        success(function (data, status, headers, config) {
            alert(data);
        }).
        error(function (data, status, headers, config) {
            alert(data);
        });

对于 php 部分,您可以使用我编写的这个函数:

function uplFile($fn,$path='upload/'){ 
    $delim = explode(';base64,',$fn);
    $type = str_replace('data:','',$delim[0]);
    switch ($type) { 
        case "image/gif": 
            $type = '.gif';
            break; 
        case "image/jpeg": 
            $type = '.jpg';
            break; 
        case "image/png": 
            $type = '.png';
            break; 
        case "image/bmp": 
            $type = '.bmp';
            break; 
    } 
    $data = base64_decode($delim[1]);  
    $file = uniqid() .$type;
    $success = file_put_contents($path.$file, $data);
    return $file;
}

此函数获取 formData() 内容作为第一个参数,并获取第二个参数的上传位置。对于您的数据,您可以轻松地使用它,如下所示:

uplFile($_POST['file']);

【讨论】:

  • 这是我从 get_file_contenets 得到的回复,但是 POST 和文件仍然是空的。---------------------------- 27672246989232 内容处置:表单数据; name="name" 50 -----------------27672246989232 内容处置:表单数据;名称=“文件”; filename="eye.png" 内容类型:image/png PNG
  • 所以它发送数据,你能告诉我print_r($_POST)的结果是什么吗?
  • 现在 $_POST 没问题,我看到了所有参数,而且 $_FILES 也不为空,但似乎 val['tmp_file'] 不包含我的文件
  • @user1315599 是的,你是对的。这就是您使用系统 FormData() 对象的原因。结果包含两部分。第一个是图像类型,第二个是图像base64 已用分号分隔。我已经更新了我的答案。检查它!
  • 我做了 $_POST 变量的 var_dump 并且没有 'photo' 参数。也许它在文件中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 2020-07-31
  • 2016-03-04
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多