我需要获得一个highcharts图像,我找到了一个代码来解决我的问题,通过ajax获取图像的名称,然后我粘贴在Highcharts API的url之前,我可以用PHP下载图像,现在,我想在PHP中执行此过程,因为名称,直到下载;我有这个代码来获取highcharts图像的名称:
var optionsStr = JSON.stringify({
"xAxis": {
"categories": [
"PRUEBA",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
]
},
"series": [
{
"data": [1, 3, 2, 4],
"type": "line"
},
{
"data": [5, 3, 4, 2],
"type": "line"
}
]
}),
exportUrl ='https://export.highcharts.com/';
dataString = encodeURI('async=true&type=image/jpeg&width=800&options=' + optionsStr);
$.ajax(
{
type: 'POST',
data: dataString,
url: exportUrl,
success: function(data)
{
console.log('get the file from relative url: ', data);
grafica=exportUrl+data;
},
error: function(err)
{
console.log('error', err.statusText)
}
});
我得到图形的名称:charts / chart.9973ffbcf0d748d6aae04ef6ec01979c.jpeg 我想知道如何在PHP中使用相同的代码:
$DataEncoded = json_encode(
array(
'xAxis'=>
array(
'categories'=> ['Ene','Feb', 'Mar', 'Abr']
),
'series'=>
array(
array(
'data'=>[1,2,3,4],
'type'=>'line'
),
array(
'data'=>[5,6,7,8],
'type'=>'line'
)
)
)
);
$DataExtra = 'async=true&type=image/jpeg&width=800&options=';
$dataString = urlencode('async=true&type=image/jpeg&width=800&options='.$DataEncoded);
$url ='https://export.highcharts.com/';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
$json=curl_exec($ch);
if(curl_errno($ch)){
echo "Entro al curl Error";
throw new Exception(curl_error($ch));
}
var_dump(json_decode($json));
curl_close($ch);
但我收到一个很棒的:NULL。有人之前做过这个吗? 我尝试通过Angular 5创建这个过程,但是,我必须编写一个cron作业来委派进程,所以,我决定使用PHP。我尝试使用file_get_contents(),但是webservice给了我:"没有找到数据图表"。
答案 0 :(得分:1)
我怀疑你的问题在这里:
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);
我相信这是期待一个String或一个数组。
此参数可以作为urlencoded字符串传递,例如' para1 = val1& para2 = val2& ...'或者作为一个数组,字段名称为键,字段数据为值。如果value是数组,则Content-Type标头将设置为multipart / form-data。从PHP 5.2.0开始,如果使用@前缀将文件传递给此选项,则value必须是数组。从PHP 5.5.0开始,不推荐使用@前缀,可以使用CURLFile发送文件。
考虑尝试以下方法:
$dataArray = array(
"async" => true,
"type" => "image/jpeg",
"width" => 800,
"options" => $DataEncoded
);
和...
curl_setopt($ch, CURLOPT_POSTFIELDS, $dataArray);
感谢@ Patrick Q捕获编码类型。您并没有完全发送JSON编码数据,而是基本上发送表单数据。
答案 1 :(得分:0)
我使用了Twisty的建议,最后我得到了图片的名称,非常感谢你。
$dataString = ('async=true&type=image/jpeg&width=800&options='.$DataEncoded);
$url ='https://export.highcharts.com/?';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$dataString);
curl_setopt($ch, CURLOPT_POST, 1);
$headers = array();
$headers[] = "Accept: application/json";
$headers[] = "Content-Type: application/x-www-form-urlencoded";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);