使用 cURL 保存图像
Save image using cURL
这是一个指向图像的URL:
如果我在 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 时,浏览器正确显示 &
字符,而不是函数将其作为参数 &
获取。
因此,如果我在 运行 命令之前将 URL 提供给 htmlspecialchars_decode()
,那么它将完美运行。
因此请注意 URL!
中的特殊字符
这是一个指向图像的URL:
如果我在 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 时,浏览器正确显示 &
字符,而不是函数将其作为参数 &
获取。
因此,如果我在 运行 命令之前将 URL 提供给 htmlspecialchars_decode()
,那么它将完美运行。
因此请注意 URL!
中的特殊字符