使用 cURL 保存图像

这是一个指向图像的 URL:

https://www.somesite.com/some/dir/jsp/data.jsp?KEY=12155&TYPE=jpg&qi=R7SWtM5F5PL4cDDFfdfpIrqIWSY3gr2XGQg=

如果我在 CLI 中使用 cURL 作为这个命令,我会得到图像:

/usr/bin/curl -o 1234.jpg 'the_url_to_image'

我需要在 PHP 中使用 cURL 和参数。我尝试了几个参数来获取图像,我总是得到一个 403 错误

已禁止访问指定资源。阿帕奇雄猫

我的参数(只有 cURL 参数,将图像写入文件的代码不在此处):

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $img_url);

 curl_setopt($ch, CURLOPT_VERBOSE, 1);

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 curl_setopt($ch, CURLOPT_AUTOREFERER, false);

 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

 curl_setopt($ch, CURLOPT_HEADER, 0);

 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36');

 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

 curl_setopt($ch, CURLOPT_COOKIEJAR,$cookie_filename);

 curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie_filename);

 $page_content  = curl_exec($ch);

 curl_close($ch);

编辑


如果我将图像 URL 提供给此页面:


onlinecurl.com


我得到了图像二进制文件,没有错误消息。


所以图像可以用cURL保存,我只需要 curl_setopt正确设置。


编辑


通过在 CLI 中运行 a 命令,图像被保存到本地路径


/usr/bin/curl -o 1234.jpg 'the_url_to_image'


当运行相同的命令时


shell_exec("/usr/bin/curl -o 1234.jpg 'the_url_to_image'")


错误消息保存在 1234.jpg 文件中。


同一命令的命令行和代码执行有什么区别?


慕少森
浏览 149回答 4
4回答

繁星点点滴滴

同一命令的命令行和代码执行有什么区别?您的用户代理甚至没有关闭:curl_setopt ($ ch, CURLOPT_USERAGENT, 'Mozilla / 5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 79.0.3945.79 Safari / 537.36');尝试将其设置为真正的 curl-cli 用户代理,例如curl_setopt($ch,CURLOPT_USERAGENT,'curl/7.63.0');或者curl_setopt($ch,CURLOPT_USERAGENT,'curl/'.(curl_version()['version']));这很罕见,但有可能(甚至有证据表明)他们正在使用用户代理白名单,而 Google Chrome(或者是 Safari?)不在他们的白名单上,但 curl-cli 是......另一种可能的解释是,他们试图检测并阻止躺在他们的用户代理上的人,并且很容易检测到您在撒谎:您(错误地)说您是 Safari 或 Chrome,以及这两者总是发送Acccept-Encoding: gzip/deflate/whatever,但你的 curl 请求没有(因为你没有使用 CURLOPT_ENCODING),因此很容易检测到你的用户代理是假的,也许这就是导致阻塞的原因。无论哪种方式,尝试使用真正的 curl 用户代理。

慕慕森

401 未经授权403被禁止这些描述得很糟糕。401 真的意味着未经过身份验证403真的意味着未授权如果这确实是一个受保护的资源,需要登录才能获取它,那么这意味着是的,服务器识别出你(你没有得到 401),但你没有所需的权限(403)。另一方面,如果图像确实是公开的,则实际粘贴链接可以帮助我们为您提供帮助。

倚天杖

事实证明,问题很简单。- 第一个线索是终端中的命令正在运行,但相同的命令shell_exec()返回错误。-第二条线索是 delboy1978uk 提到的错误不是 401 not authenticated而是 403 non authorized。所以一定是 URL 或参数有问题。我打印了 URL,但没有发现错误……长话短说,问题出在 URL 中的特殊字符上。当我打印 URL 时,浏览器&正确显示了字符,而不是函数将其作为参数&。htmlspecialchars_decode()因此,如果我在运行命令之前提供 URL,那么它可以完美运行。因此,请注意 URL 中的特殊字符!

湖上湖

您可以尝试添加curl_setopt($ch, CURLOPT_POST, 0);如果这不起作用,您必须在 web.xml 中添加 Apache Tomcat:<login-config>&nbsp; <auth-method>BASIC</auth-method></login-config>
打开App,查看更多内容
随时随地看视频慕课网APP