从url抓取图像并保存,大小为0字节

时间:2013-04-29 19:29:08

标签: php image file-get-contents

我没有安装curl。 之前已经提到过这段代码应该可行,

file_put_contents($target_path,file_get_contents($image));

但它不适合我,它会使图像具有正确的名称等...但大小为0字节。 $ target_path具有正确的权限,allow_url_fopen为On。

我做错了吗?

3 个答案:

答案 0 :(得分:3)

allow_url_fopen不是唯一的标准,因为网址上的file_get_contents可能会中断。服务器可能设置为处理或检测身份验证/用户代理等。

首先尝试将数据放入变量并打印出来以查看是否能够获取内容;

$img = "";
$img = file_get_contents($image);
echo $img; //for debugging..
//for running..
if(!$img) die("no data fetched");

现在,如果$img有数据,接下来尝试将其写入文件:

$result = file_put_contents($target_path,$img);
if($result=== FALSE) 
  die("Error writing data into $target_path");
else
  echo "$result bytes written to $target_path";

您面临的问题是您拥有的嵌套功能列表中存在多个故障点。虽然它很漂亮并且将多行代码压缩成一行但很难调试,并且在你面对的情况下,你将无法轻易确定哪一行是令人讨厌的代码。

答案 1 :(得分:0)

必须正常工作检查$image$target_path内容路径和网址是否正确才能使用dirname(__FILE__) $target_pathdirname(__FILE__).'/image.jpg'就像$target_path一样正确的目标路径

注意您必须使用 function Request($url,$File="",$Method='POST',$data=null, $optional_headers = null,$Debug=0){ $params = array('http' => array('method' => $Method)); $optional_headers.="Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"; $optional_headers.="Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n"; $optional_headers.="Accept-Encoding:gzip,deflate,sdch\r\n"; $optional_headers.="Accept-Language:en-US,en;q=0.8\r\n"; $optional_headers.="Cache-Control:max-age=0\r\n"; $optional_headers.="Connection:keep-alive\r\n"; $optional_headers.="User-Agent:Mozilla/5.0 AppleWebKit/536.5 (KHTML, like Gecko) SepidarBrowser/1.0.100.52 Safari/536.5\r\n"; if ($data !== null) { $params['http']['content'] = $data; } if ($optional_headers !== null) { $params['http']['header'] = $optional_headers; } $ctx = stream_context_create($params); $fp = @fopen($url, 'rb', false, $ctx); if (!$fp) { return false; } $response= @stream_get_meta_data($fp); $out['header'] = $response['wrapper_data']; $out['body']=''; if($File!=""){ $fout = @fopen($File, 'w+'); } while(!@feof($fp)){ $buffering=@fread($fp,1024*8); // echo "***************\n".strlen($buffering)."\n".$buffering."\n***********************"; if($buffering==''){break;} if($File!=""){ @fwrite($fout,$buffering); if($Debug==1)echo strlen($buffering)."-->Download And Stored IN".$File; } $out['body'] .=$buffering; } if(trim(@$out['header']['Content-Encoding'])=='deflate'){ $out['body']=gzinflate($out['body']); } fclose($fp); return $out; } Request($target_path,$image,'GET');

的完整路径

你可以测试这个与fopen一起工作的功能,它也可以工作但是速度较慢

{{1}}

答案 2 :(得分:0)

尝试拆分你的代码并添加一些基本的错误处理,这样你就可以做一些事情而不是只是在出错的情况下将0字节写入文件:

<?php 
error_reporting(E_ALL);
$target_path = "./some_path/";
$new_img = "new_image.jpg";

if(file_exists($target_path)){
    $img = file_get_contents($image);
    if(strlen($img) >=1){
        file_put_contents($target_path . $new_img, $img);
    }else{
        echo 'Error fetching $image';
    }
}else{
    echo '$target_path not found';
}
?>