使用 cURL 保存图像

Save image using 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错误

Access to the specified resource has been forbidden. Apache Tomcat

我的参数(只有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

我取回图像二进制文件,但没有错误消息。

所以图片可以用c保存URL,我只需要把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 文件中。

同一命令的命令行和代码执行有何不同?

您可以尝试添加

curl_setopt($ch, CURLOPT_POST, 0);

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

<login-config>
  <auth-method>BASIC</auth-method>
</login-config>

What can be the difference in the command line and code execution of the same command ?

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

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 真的意味着没有 Authenticated

403 真的表示没有授权

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

另一方面,如果手上的图像确实是 public,实际粘贴 link 可以帮助我们帮助您。

事实证明问题很简单。

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

-第二条线索是,正如 delboy1978uk 提到的,错误不是 401 未认证,而是 403 未授权.

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

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

因此请注意 URL!

中的特殊字符