使用 imgur api v3 使用 php 匿名上传图片

Posted

技术标签:

【中文标题】使用 imgur api v3 使用 php 匿名上传图片【英文标题】:using imgur api v3 to upload images anonymously using php 【发布时间】:2013-06-20 14:29:53 【问题描述】:

我打算使用其 api 匿名上传图像到 imgur,我在匿名上传类别中注册了我的应用程序并获得了客户端 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  src="';
echo $xmlsimple->links->original;
echo '">';

curl_close ($curl);

?>

【问题讨论】:

遇到同样的问题,如果您能找到解决方案,请分享。 你试过用rb模式打开图片吗? 如果由于上传图片需要很长时间而遇到最大执行时间限制,那么您有两种选择:如果可能,增加服务器上的限制,或者找到另一种上传方式图像(如果他们提供这样的选项,也许只需提供图像 URL 并让服务从您的服务器本身下载它)。顺便说一句,如果您的服务器有足够的连接,具有合理图像大小的“正常”图像上传几乎不需要 30 秒。 api.imgur.com/endpoints/image 说“图像:二进制文件、base64 数据或图像的 URL” - 所以如果您尝试上传的图像通过 HTTP 公开可用,我会尝试使用 URL在您的服务器上。 (或者尝试使用二进制而不是 base64,因为 base64 会增加要上传的数据量 -> 需要更多时间。) @CBroe,我只有 base64 格式的图像,我无法更改,是的,它超过了最大超时时间 【参考方案1】:

在 post 变量中发送client_id 是问题所在。它需要在请求标头中发送。此外,您正在请求 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  src="%s" >', $reply->data->link);

更新 1

Live functional example 和 and source 基于此代码和调试输出。

【讨论】:

它不会进入超时状态,但我收到错误消息“尝试在第 20 行获取 C:\xampp\htdocs\path\imgur.php 中非对象的属性”和行20 是 printf 行。 error_reporting(E_ALL); 添加到脚本的顶部。 curl 请求由于某种原因失败。 检查 update 1 链接以获取实时示例。您的本地环境似乎有问题。 链接关闭。更新【参考方案2】:

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

<?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); 

?>

【讨论】:

我认为您的意思是您在查看我的代码后发现了错误。 实际上错误不存在,只是将标头放在双引号中而不使用字符串连接很奇怪;)您的回答确实对我有所帮助并感谢:) @h0tw1r3 哈哈,我很欣赏你的辛勤工作:) 今天才发现它,它对我帮助很大。 Imgur API 文档中的示例很少,所以我希望找到一个像这样的 Stack 线程来帮助我入门。荣誉。 有人可以告诉我,如果上传,我如何从 imgur 获取直接图像的链接?【参考方案3】:

如果您对上述脚本有疑问,请尝试 curl 跳过已验证的 SSL,如下所示:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

【讨论】:

以上是关于使用 imgur api v3 使用 php 匿名上传图片的主要内容,如果未能解决你的问题,请参考以下文章

PHP:使用同步标志上传 YouTube v3 API 字幕

Google Maps Api v3:如何更改方向(设置)面板中的默认航点标记?

如何使用 php 使用 Youtube Api v3 喜欢 Youtube 视频

侧边栏 Google Maps API v3 使用 PHP/MYSQL 提取数据 [关闭]

在 php 中使用 google calendar api v3 获取定期事件

文件移动 Google Drive API v3 PHP