我已经使用重力形式在Wordpress中创建了一个形式,其中包括一个文件上载字段。表单完成后,我使用了一个Webhook,在Gravity表单精英插件中进行设置,以将表单字段传递到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¤cy=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完全停止而不会出现错误消息吗?我可以像请求Bin一样从PHP数组中访问此变量吗?
我必须先对值进行解码,然后才能在脚本中使用它/将其输出到日志中?在我的实际脚本中,请注意,我并没有将所有变量都转储到日志中,这只是为了显示它,这是最简单的示例,在我的主脚本中,将它们逐个选择并使用var = $ _POST分配给变量[“ 1”]等
编辑:
我已在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。)
谢谢
您不能直接使用$ _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));