【问题标题】:Image upload not working in Linkedin V2 API图片上传在 Linkedin V2 API 中不起作用
【发布时间】:2019-08-31 17:15:05
【问题描述】:

我现在正在使用 Linkedin V2 与我的应用程序集成。我在尝试将图片上传到 Linkedin 时遇到问题。

我已经从终端尝试了 CURL 请求(我使用的是 Ubuntu 操作系统)并得到如下响应:

终端命令(工作和文件上传):

curl -i --upload-file /Users/peter/Desktop/superneatimage.png --header "Authorization: Bearer redacted" 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1'

回复如下:

HTTP/2 201 日期:2019 年 4 月 10 日星期三 09:14:44 UTC 服务器:播放 设置cookie:lang=v=2&lang=en-us;路径=/;域=api.linkedin.com x-ambry-creation-time:2019 年 4 月 10 日星期三 09:14:44 UTC 访问控制允许来源:https://www.linkedin.com 内容长度: 0

在我的应用程序中集成 CURL 请求时遇到问题。我的应用程序中的 CURL 请求代码如下所示。

$headers = array();
$headers[] = 'Authorization: Bearer xxxxx';
$headers[] = 'X-Restli-Protocol-Version: 2.0.0';
$headers[] = 'Content-Type: multipart/form-data';
$ch = curl_init();
$options = array(
    CURLOPT_HEADER => true,
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_URL => 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1',
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => array("upload-file" => '/Users/peter/Desktop/superneatimage.png')
    // CURLOPT_POSTFIELDS => array("upload-file" => new CURLFile('/Users/peter/Desktop/superneatimage.png'))
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
print_r($response);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

回复为:

HTTP/1.1 400 Bad Request Server: Play Set-Cookie: lang=v=2&lang=en-us; 路径=/;域=api.linkedin.com 日期:2019 年 4 月 10 日星期三 09:16:25 GMT 内容长度:0 X-Li-Fabric:prod-lsg1 连接:keep-alive

Link to the Linkedin doc

Similar question from SO,这并没有解决我的问题。

【问题讨论】:

  • 您没有上传任何文件,您只是发送文件路径。使用@ 为文件路径添加前缀 进行文件上传的方式,但自 PHP 5.5.0 起已弃用,因此您应该使用 php.net/manual/en/class.curlfile.php
  • 如你所说,我在图像路径之前使用了@,但这对我没有帮助。使用 PHP 7

标签: php curl linkedin-api php-curl


【解决方案1】:

使用 Guzzle HTTP 客户端而不是 curl。我尝试了 curl,但它不起作用。

首先使用以下命令在当前目录中安装作曲家:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

composer 更新后,运行以下命令安装 Guzzle(默认版本为 3.9,它需要 php >= 5.3.3。您可以根据您的 php 版本指定):

php composer.phar 需要 guzzlehttp/guzzle

Guzzle客户端安装成功后,请使用以下代码上传文件

    require 'vendor/autoload.php';
    $client =new \GuzzleHttp\Client();
    $image_path='/path_to_your_image/my_image.png';
    $result=$client->request('PUT',$target_url, [
             'headers' => [
                 'Authorization' => 'Bearer ' . $token
              ],
              'body' => fopen($image_path, 'r'),
    
        ]);

您将获得成功以下的完整回复

HTTP/2 201

日期:2019 年 4 月 10 日星期三 09:14:44 UTC 服务器:播放 set-cookie: lang=v=2&lang=en-us;路径=/;域=api.linkedin.com x-ambry-creation-time:2019 年 4 月 10 日星期三 09:14:44 UTC 访问控制允许来源:https://www.linkedin.com 内容长度: 0

Guzzle 是一个 PHP HTTP 客户端,它可以轻松发送 HTTP 请求并轻松与 Web 服务集成。

  • 用于构建查询字符串、POST 请求、流式传输大型上传、流式传输大型下载、使用 HTTP cookie、上传 JSON 数据等的简单界面...
  • 可以使用相同的接口发送同步和异步请求。 对请求、响应和流使用 PSR-7 接口。这允许您在 Guzzle 中使用其他 PSR-7 兼容库。
  • 抽象出底层 HTTP 传输,允许您编写与环境和传输无关的代码;即,对 cURL、PHP 流、套接字或非阻塞事件循环没有硬依赖。
  • 中间件系统允许您增强和组合客户端行为。

【讨论】:

  • 感谢您的帮助。我会在检查后告诉你。如何在 Linux 中安装 Guzzle?你对此有什么想法吗?
  • 感谢您提供详细信息。我已经收到回复了。
猜你喜欢
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2021-02-28
  • 2020-03-10
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多