使用Imgur API V3和PHP匿名上传图片

15

我计划使用imgur的API匿名上传图片,我已经在匿名上传类别中注册了我的应用程序并获得了客户端ID和客户端密钥。如何使用PHP上传图像到imgur并检索图像的直接URL?有人可以提供任何示例链接吗?这是我尝试做的事情,但是我收到了“致命错误:超过30秒的最大执行时间”的错误。

<?php

$client_id = :client_id; //put your api key here
$filename = "images/q401x74ua3402.jpg";
$handle = fopen($filename, "r");
$data = fread($handle, filesize($filename));

//$data is file data
$pvars   = array('image' => base64_encode($data), 'key' => $client_id);
$timeout = 30;
$curl    = curl_init();

curl_setopt($curl, CURLOPT_URL, 'https://api.imgur.com/3/upload.json');
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);
$xml = curl_exec($curl);
$xmlsimple = new SimpleXMLElement($xml);
echo '<img height="180" src="';
echo $xmlsimple->links->original;
echo '">';

curl_close ($curl);

?>

1
遇到了同样的问题,请分享一下如果你找到了解决方案。 - user434885
如果由于上传图像时间过长而遇到最大执行时间限制,则您有两个选择:如果可能的话,增加服务器上的限制,或者找到另一种上传图像的方法(也许只需提供图像URL,并让服务从您的服务器自行下载,如果他们提供这样的选项)。顺便说一下,如果您的服务器具有足够的连接,则“正常”图像上传应该很难超过30秒。 - CBroe
@CBroe,我的图片只有base64格式,我无法更改它,是的,它超过了最大超时时间。 - scottydelta
那么你唯一的选择就是增加超时时间。(或者编写一个脚本,输出图像[适当的Content-Type头后跟base64解码的图像数据],从而通过HTTP使该图像可用。) - CBroe
你仍然可以将数据进行base64解码并以二进制形式发送。顺便问一下,你尝试设置"type"参数了吗?不确定API是否能自行识别所使用的类型。 - CBroe
显示剩余5条评论
3个回答

30

client_id作为一个post变量发送是问题所在。它需要作为请求头发送。另外,你正在请求JSON响应,但尝试解析它作为XML。

<?php

$client_id = "FILLMEIN";
$image = file_get_contents("img/cool.jpg");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
curl_setopt($ch, CURLOPT_POSTFIELDS, array('image' => base64_encode($image)));

$reply = curl_exec($ch);
curl_close($ch);

$reply = json_decode($reply);
printf('<img height="180" src="%s" >', $reply->data->link);

更新1:

Live functional example(带有调试输出)和源代码基于此代码。


它没有进入超时状态,但我收到了一个错误,提示“在 C:\xampp\htdocs\path\imgur.php 的第20行试图获取非对象属性”,而第20行是 printf 行。 - scottydelta
在你的脚本顶部添加 error_reporting(E_ALL);。curl请求由于某种原因失败了。 - h0tw1r3
请查看更新1链接以获取实时示例。看起来您的本地环境出了些问题。 - h0tw1r3
链接已断。请更新。 - Luigi Lopez

8

发现错误,我需要将授权详细信息发送为标头,例如代码

<?php
$client_id = 'xxxxxxxx';

$file = file_get_contents("test-image.png");

$url = 'https://api.imgur.com/3/image.json';
$headers = array("Authorization: Client-ID $client_id");
$pvars  = array('image' => base64_encode($file));

$curl = curl_init();

curl_setopt_array($curl, array(
   CURLOPT_URL=> $url,
   CURLOPT_TIMEOUT => 30,
   CURLOPT_POST => 1,
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_HTTPHEADER => $headers,
   CURLOPT_POSTFIELDS => $pvars
));

$json_returned = curl_exec($curl); // blank response
echo "Result: " . $json_returned ;

curl_close ($curl); 

?>

12
我认为你的意思是在查看我的代码之后发现了错误。 - h0tw1r3
实际上错误并不存在,只是将头文件用双引号括起来而不使用字符串连接却奇怪地起作用了;) 你的回答确实帮助了我,谢谢:) - scottydelta
2
@h0tw1r3 哈哈,感谢你的努力 :) 今天刚发现这个东西,帮了我很多。Imgur API 的文档缺乏例子,所以我希望能找到像这样的 Stack 线程来让我入门。赞。 - Jake
有人能告诉我如何获取从Imgur上传的直接图片链接吗? - Sejoo

5
如果您遇到上述脚本问题,请尝试使用curl跳过验证SSL,如下所示:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接