PHP cURL可同时保存图像&;获取标头响应
我试图使用cURL将图像同时保存到文件中,同时还返回加载该文件以进行保存时返回的标题 原因是每次加载和/或保存图像时都会生成一个唯一的cookie,因此如果我保存文件,然后对同一图像URL执行另一个请求以获取cookie,cookie将不会与保存的图像(它是验证码图像)正确配对 图像只能加载一次,每次加载图像时,必须保存图像(无需从服务器重新请求图像),并同时显示标题,以便获取加载和保存图像时生成的cookiePHP cURL可同时保存图像&;获取标头响应,php,image,curl,cookies,captcha,Php,Image,Curl,Cookies,Captcha,我试图使用cURL将图像同时保存到文件中,同时还返回加载该文件以进行保存时返回的标题 原因是每次加载和/或保存图像时都会生成一个唯一的cookie,因此如果我保存文件,然后对同一图像URL执行另一个请求以获取cookie,cookie将不会与保存的图像(它是验证码图像)正确配对 图像只能加载一次,每次加载图像时,必须保存图像(无需从服务器重新请求图像),并同时显示标题,以便获取加载和保存图像时生成的cookie function getImageandCookie($ImageURL) {
function getImageandCookie($ImageURL) {
$rand = rand();
$image_file = $_SERVER['DOCUMENT_ROOT'] . '/image/' . $GLOBALS['id'] . $rand . '.jpg';
$fp = fopen ($image_file, 'w+');
$ch = curl_init($ImageURL);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);
return $data;
}
这就是我目前得到的,它确实返回了头并保存了一个文件,但是当以.jpg格式查看时,该文件已损坏。如果我将文件类型更改为.txt,我可以看到标题,但是标题下有一堆乱码字符,它们不是图像。因此,很明显,正在保存的文件是标题和图像的组合,我无法单独获取它们,同时确保只有一个图像请求
function getImageandCookie($ImageURL) {
$rand = rand();
$image_file = $_SERVER['DOCUMENT_ROOT'] . '/image/' . $GLOBALS['id'] . $rand . '.jpg';
$fp = fopen ($image_file, 'w+');
$ch = curl_init($ImageURL);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);
return $data;
}
更多详情:
我正在尝试将图像保存到服务器上的一个文件中,同时使加载该图像以保存时返回的标题可用于脚本的其余部分
如果加载此图像:http://ipv4.google.com/sorry/image?id=2125815723022350864&hl=en
您将看到创建的cookie与图像中的文本“绑定”。如果重新加载图像或对同一URL发出新请求,将创建一个新的cookie和图像“对”
因此,我需要加载该图像一次,并将其保存到文件中,同时抓取标题(即“绑定”到该特定图像的cookie所在的位置),同时确保仅请求该图像一次。2小时后
<?
//error_reporting(E_ALL);
//ini_set('display_errors', '1');
$image_file = "captcha.jpg";
//$cookie = "gcookie";
$ch = curl_init("http://ipv4.google.com/sorry/image?id=2125815723022350864&hl=en");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
//curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
$data = curl_exec($ch);
//split the header and body of request
$matches = preg_split('/^\s*$/im', $data);
$header = $matches[0];
//extract cookie from header
preg_match_all('/Set-Cookie: (.*?)\s+/i', $header, $gCookie, PREG_PATTERN_ORDER);
$gCookie = $gCookie[1][0];
echo $gCookie;
//GOOGLE_ABUSE_EXEMPTION=ID=a85908efa22e6f9b:TM=1429660423:C=c:IP=x.x.x.x-:S=APGng0vbHyNi1KCn9O1bnspO8BgF4LFEhQ;
//The body is the image, we cleanup the header/body line break and save it
$body = $matches[1] ;
$body = implode("\n", array_slice(explode("\n", $body), 1));
file_put_contents($image_file, $body);
curl_close($ch);
我之前发布的回答不起作用,我仍在努力解决这个问题,只是为了确定,您想将响应标题保存到文件中,对吗?顺便问一下,你知道这个网站吗?我已经使用了它,它可以工作。不,我想将图像保存到一个文件中,同时使加载该图像时返回的标题可用于脚本的其余部分。唯一需要保存到文件中的是图像。您需要将返回头分配给变量,以便以后在脚本中使用它,我是否正确地理解了这一点?是的,没错。我需要对一个映像发出一个请求,然后将该映像保存到服务器上的一个文件中,同时将头返回到一个变量,以便脚本的其余部分可以使用它们。只对映像发出一个请求非常重要,因为在每次请求映像时,返回的头都会更改,并且特定于加载的映像。您没有使用CURLOPT_RETURNTRANSFER
任何特殊原因吗?