使用PHP通过API v3将活动上传到Strava - php

我正在开发一个应用程序,其中我希望能够使用其API v3将活动(GPX文件)上传到Strava。

我的应用程序成功处理了OAuth流程-我能够成功请求活动等。

但是,当我尝试上传活动时-失败。

这是我的代码的相关示例:

// $filename is the name of the GPX file
// $actual_file contains the full path

$actual_file = realpath($filename);
$url="https://www.strava.com/api/v3/uploads";
$postdata = "activity_type=ride&file=". "@" . $actual_file . ";filename=" . $filename . "&data_type=gpx";

$headers = array('Authorization: Bearer ' . $strava_access_token);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_POST, 3);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec ($ch);

这是我的回应:

{"message":"Bad Request", "errors":[{"resource":"Upload", "field":"file","code":"not a file"}]}

然后我尝试了这个:

// $filename is the name of the GPX file
// $actual_file contains the full path

$actual_file = realpath($filename);

$url="https://www.strava.com/api/v3/uploads";

$postfields = array(
    "activity_type" => "ride",
    "data_type" => "gpx",
    "file" => "@" . $filename
);
$postdata = http_build_query($postfields);

$headers = array('Authorization: Bearer ' . $strava_access_token, "Content-Type: application/octet-stream");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_POST, count($postfields));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$fp = fopen($filename, 'r');
curl_setopt($ch, CURLOPT_INFILE, $fp);

$json = curl_exec ($ch);
$error = curl_error ($ch);

这是我的回应:

{"message":"Bad Request", "errors":[{"resource":"Upload", "field":"data","code":"empty"}]}

显然,尝试传递GPX文件时我做错了。

是否可以提供一些示例PHP代码来说明其工作原理?

物有所值-我相当确定GPX文件有效(实际上是我使用Strava的导出功能下载的文件)。

参考方案

我希望在发帖后不到一天回答我自己的问题,这不是不好的形式。但是我已经开始工作了,所以我也可以,以防万一其他人觉得它有用。

// $filename is the name of the file
// $actual_file includes the filename and the full path to the file
// $strava_access_token contains the access token

$actual_file = realpath($filename);

$url="https://www.strava.com/api/v3/uploads";

$postfields = array(
    "activity_type" => "ride",
    "data_type" => "gpx",
    "file" => '@' . $actual_file . ";type=application/xml"
);

$headers = array('Authorization: Bearer ' . $strava_access_token);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$response = curl_exec ($ch);

显然,重要的是不要包含CURLOPT_POST选项。

PHP:从函数返回值并直接回显它? - php

这可能是一个愚蠢的问题,但是……的PHPfunction get_info() { $something = "test"; return $something; } html<div class="test"><?php echo get_info(); ?></div> 有没有办…

cURL-加载具有CloudFlare保护的网站 - php

我有一个网站,我想使用cURL加载。但是,我正在谈论的站点正在使用cloudflare保护。在cURL request =>上,它说“检查您的浏览器,您将在5秒钟内被重定向”,我被重定向到一个不存在的页面,因为我认为我没有通过某些保护测试。我一直在寻找答案很长时间,但我发现只有两个有用的链接:Link 1Link 2但是我仍然无法弄清楚。对我有帮助吗?…

标头和包含项之间有什么区别,应在何处使用 - php

我对两个词感到困惑header ("Location:homepage_php");include("homepage.php");我猜想标题是在检查密码过程后使用的,关于include,您可以在任何地方使用它。但是我不确定它们之间的实际区别是什么以及应该使用这两个中的哪个位置。 参考方案 标头将用户转发到新页面,因此…

内置函数的PHP源代码 - php

PHP是用C编写的吗?在哪里可以找到PHP源代码,而无需下载所有源代码? 参考方案 PHP函数是用C编写的-您可以在lxr.php.net中找到可浏览的源代码。例如:http://lxr.php.net/opengrok/xref/PHP_5_3/ext/standard/array.c#1242PS:通常,只需在搜索中键入函数名称即可找到函数定义。使用诸如…

PHP:如何从JSON数组获取属性? - php

我有以下JSON数组:使用PHP,如何从上面的JSON数组中获取geometery->location->lat&lng值?例如(伪代码):<?php $json = { "status": "OK", "results": [ { "types": [ �…