为了账号安全,请及时绑定邮箱和手机立即绑定

使用 cURL 保存图像

使用 cURL 保存图像

PHP
慕少森 2022-07-02 17:04:04
这是一个指向图像的 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 文件中。同一命令的命令行和代码执行有什么区别?
查看完整描述

4 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

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

您的用户代理甚至没有关闭:

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 用户代理。


查看完整回答
反对 回复 2022-07-02
?
慕慕森

TA贡献1856条经验 获得超17个赞

401 未经授权

403被禁止

这些描述得很糟糕。

401 真的意味着未经过身份验证

403真的意味着未授权

如果这确实是一个受保护的资源,需要登录才能获取它,那么这意味着是的,服务器识别出你(你没有得到 401),但你没有所需的权限(403)。

另一方面,如果图像确实是公开的,则实际粘贴链接可以帮助我们为您提供帮助。


查看完整回答
反对 回复 2022-07-02
?
倚天杖

TA贡献1828条经验 获得超3个赞

事实证明,问题很简单。

- 第一个线索是终端中的命令正在运行,但相同的命令shell_exec()返回错误。

-第二条线索是 delboy1978uk 提到的错误不是 401 not authenticated而是 403 non authorized

所以一定是 URL 或参数有问题。我打印了 URL,但没有发现错误……长话短说,问题出在 URL 中的特殊字符上。当我打印 URL 时,浏览器&正确显示了字符,而不是函数将其作为参数&

htmlspecialchars_decode()因此,如果我在运行命令之前提供 URL,那么它可以完美运行。

因此,请注意 URL 中的特殊字符!


查看完整回答
反对 回复 2022-07-02
?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以尝试添加


curl_setopt($ch, CURLOPT_POST, 0);

如果这不起作用,您必须在 web.xml 中添加 Apache Tomcat:


<login-config>

  <auth-method>BASIC</auth-method>

</login-config>


查看完整回答
反对 回复 2022-07-02
  • 4 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信