PHP在包含文件上载时从Gravity表单接收POST数据

时间:2018-02-01 22:02:45

标签: php wordpress webhooks gravity-forms-plugin

我使用重力表单在Wordpress中创建了一个表单,其中包含一个文件上载字段。完成表单后,我使用webhook,在Gravity表单中设置elite插件,将表单字段传递给PHP脚本,然后通过API将数据上传到外部系统。

问题是当我在没有上传文件的情况下完成表单时效果很好,所有字段都传递给PHP变量和脚本运行。但是,当表单包含文件上载字段时,脚本将失败,并且不会输出错误日志。

我使用更简单的表单和脚本重新创建了问题,以确认这是问题,我的测试表单包含两个字段,即字段上传和单行文本字段。我的简单测试脚本如下所示:

<?php    
$output = var_export($_POST, true);
    error_log($output);
?>

当提交表单时没有附加文件时,日志文件显示输出的以下变量:

[01-Feb-2018 21:44:36 Europe/London] array (
  'id' => '1166',
  'form_id' => '17',
  'date_created' => '2018-02-01 21:44:34',
  'is_starred' => '0',
  'is_read' => '0',
  'ip' => '82.**.**.246',
  'source_url' => 'http://****.******.co.uk/?gf_page=preview&id=17',
  'currency' => 'USD',
  'created_by' => '1',
  'user_agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
  'status' => 'active',
  1 => 'Test No Photo',
  2 => '',
)

注意:源URL和IP已被屏蔽,实际日志中包含正确的IP和URL。

但是,只要我在表单中包含文件上传然后将其发送到脚本,就不会向日志输出任何内容,并且脚本似乎不会运行。

值得注意的是,请求可以与Requestbin一起使用。以下是来自上传字段的数据输出:

is_starred: 0
id: 1163
1: Test with Photo
user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
created_by: 1
source_url: http://***.****.co.uk/?gf_page=preview&id=17
ip: 82.**.***.246
form_id: 17
status: active
currency: USD
2: http://****.***.co.uk/wp-content/uploads/gravity_forms/17-b570285e8ba734ff4ab3956428bd8eb9/2018/02/Child26.jpg
is_read: 0
date_created: 2018-02-01 20:48:20

原始身体是:

id=1163&form_id=17&date_created=2018-02-01+20%3A48%3A20&is_starred=0&is_read=0&ip=82.**.***.246&source_url=http%3A%2F%2F***.***.co.uk%2F%3Fgf_page%3Dpreview%26id%3D17&currency=USD&created_by=1&user_agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F63.0.3239.132+Safari%2F537.36&status=active&1=Test+with+Photo&2=http%3A%2F%2Fwww.********.co.uk%2Fwp-content%2Fuploads%2Fgravity_forms%2F17-b570285e8ba734ff4ab3956428bd8eb9%2F2018%2F02%2FChild26.jpg

我再次删除了实际的域名,但请求的其余部分如请求文件夹中所示。

所以有人可以帮我解决为什么上面的帖子数据中的文件上传值会导致PHP在没有错误消息的情况下完全停止吗?有什么办法可以用PHP中的数组以与Request Bin相同的方式访问这个变量吗?

在我在脚本中使用它并将其输出到日志之前,我是否必须以某种方式解码该值?作为我实际脚本中的旁注,我不会将所有变量转储到日志中,这只是为了在其中显示最简单的示例,在我的主脚本中,它们被逐一选择并分配给变量使用var = $ _POST [&#34; 1&#34;]等。

编辑:

我在Gravity Forms中启用了日志记录选项,它确认发送的POST数据内容是:

[body] => Array
    (
        [id] => 1167
        [form_id] => 17
        [date_created] => 2018-02-01 22:31:42
        [is_starred] => 0
        [is_read] => 0
        [ip] => 82.**.***.246
        [source_url] => http://***.***.co.uk/?gf_page=preview&id=17
        [post_id] => 
        [currency] => USD
        [payment_status] => 
        [payment_date] => 
        [transaction_id] => 
        [payment_amount] => 
        [payment_method] => 
        [is_fulfilled] => 
        [created_by] => 1
        [transaction_type] => 
        [user_agent] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
        [status] => active
        [1] => Test No Photo
        [2] => http://***.***.co.uk/wp-content/uploads/gravity_forms/17-b570285e8ba734ff4ab3956428bd8eb9/2018/02/miniserver-image.jpg
    )

有什么关于变量2会导致我的PHP脚本在将POST数据转储到日志文件时崩溃吗? (我已经删除了上面代码中的域和IP。)

由于

1 个答案:

答案 0 :(得分:0)

您不能直接使用$ _POST来获取webhook的有效负载,请使用类似这样的东西:

if($json = json_decode(file_get_contents("php://input"), true)) {
     print_r($json);
     $data = $json;
} else {
     print_r($_POST);
     $data = $_POST;
}

error_log(print_r($data,true));