2011-06-25 42 views
32

我需要使用CURL从URL保存图像并将其保存到我的服务器上的文件夹。我一直在与这个代码作斗争,无济于事。理想情况下,我想抓取图像并将其保存为“photo1”或其他内容。帮帮我!从卷曲URL保存图像PHP

function GetImageFromUrl($link) 

    { 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_POST, 0); 

    curl_setopt($ch,CURLOPT_URL,$link); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    $result=curl_exec($ch); 

    curl_close($ch); 

    return $result; 

    } 

    $sourcecode = GetImageFromUrl($iticon); 

    $savefile = fopen(' /img/uploads/' . $iconfilename, 'w'); 
    fwrite($savefile, $sourcecode); 
    fclose($savefile); 

回答

78

试试这个:

function grab_image($url,$saveto){ 
    $ch = curl_init ($url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1); 
    $raw=curl_exec($ch); 
    curl_close ($ch); 
    if(file_exists($saveto)){ 
     unlink($saveto); 
    } 
    $fp = fopen($saveto,'x'); 
    fwrite($fp, $raw); 
    fclose($fp); 
} 

,并确保在php.ini中allow_url_fopen选项是让

+0

谢谢!我会继续尝试这件事情,看看它是否有效。 – David

+11

请记住编码良好的网站将查找用户代理。每个浏览器,平板电脑或手机都会有一个用户代理!如果您仍然无法获取图像,最有可能是因为用户代理检测,请添加...'curl_setopt($ ch,CURLOPT_USERAGENT,'MyImage Collector + http://www.yourdomainname/mybot.html'); '或欺骗一个真正的'curl_setopt($ ch,CURLOPT_USERAGENT,'Mozilla/5.0(Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13)Gecko/20080311 Firefox/2.0.0.13');' – bbullis

+0

像这样保存图像时是否有任何文件大小限制? PHP配置中的文件上传限制是否会影响到这一点? – Foreever

21

选项#1

而是选择二进制/原始数据组合成的变量然后写入,你可以使用CURLOPT_FILE选项直接显示一个文件到curl下载。

下面是函数:

// takes URL of image and Path for the image as parameter 
function download_image1($image_url, $image_file){ 
    $fp = fopen ($image_file, 'w+');    // open file handle 

    $ch = curl_init($image_url); 
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want 
    curl_setopt($ch, CURLOPT_FILE, $fp);   // output to file 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);  // some large value to allow curl to run for a long time 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); 
    // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints 
    curl_exec($ch); 

    curl_close($ch);        // closing curl handle 
    fclose($fp);         // closing file handle 
} 

这里是你应该怎么称呼它:

// test the download function 
download_image1("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2", "local_image1.jpg"); 

选项#2

现在,如果你想下载非常大的文件,以上情况功能可能不会变得方便。您可以使用下面的函数来处理大文件。另外,如果需要,您可以打印进度(以%或任何其他格式)。下面的功能是通过使用callback函数来实现的,该函数将大块数据写入文件中,以进行下载。

// takes URL of image and Path for the image as parameter 
function download_image2($image_url){ 
    $ch = curl_init($image_url); 
    // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // enable if you want 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 1000);  // some large value to allow curl to run for a long time 
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); 
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, "curl_callback"); 
    // curl_setopt($ch, CURLOPT_VERBOSE, true); // Enable this line to see debug prints 
    curl_exec($ch); 

    curl_close($ch);        // closing curl handle 
} 

/** callback function for curl */ 
function curl_callback($ch, $bytes){ 
    global $fp; 
    $len = fwrite($fp, $bytes); 
    // if you want, you can use any progress printing here 
    return $len; 
} 

这里是如何调用该函数:

// test the download function 
$image_file = "local_image2.jpg"; 
$fp = fopen ($image_file, 'w+');    // open file handle 
download_image2("http://www.gravatar.com/avatar/10773ae6687b55736e171c038b4228d2"); 
fclose($fp);         // closing file handle 
1

改进Komang答案(添加引用者和用户代理,请检查您是否可以写入文件),返回true,如果它是确定的版本,如果出现错误,则返回false:

public function downloadImage($url,$filename){ 
    if(file_exists($filename)){ 
     @unlink($filename); 
    } 
    $fp = fopen($filename,'w'); 
    if($fp){ 
     $ch = curl_init ($url); 
     curl_setopt($ch, CURLOPT_HEADER, 0); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
     $result = parse_url($url); 
     curl_setopt($ch, CURLOPT_REFERER, $result['scheme'].'://'.$result['host']); 
     curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'); 
     $raw=curl_exec($ch); 
     curl_close ($ch); 
     if($raw){ 
      fwrite($fp, $raw); 
     } 
     fclose($fp); 
     if(!$raw){ 
      @unlink($filename); 
      return false; 
     } 
     return true; 
    } 
    return false; 
} 
+1

'CURLOPT_RETURNTRANSFER'首先将整个文件读取到一个php变量中。速度较慢,可能会破坏大文件。改为使用'CURLOPT_FILE'传递文件指针。 – Walf

1

这是最简单的实现。

function downloadFile($url, $path) 
{ 
    $newfname = $path; 
    $file = fopen($url, 'rb'); 
    if ($file) { 
     $newf = fopen($newfname, 'wb'); 
     if ($newf) { 
      while (!feof($file)) { 
       fwrite($newf, fread($file, 1024 * 8), 1024 * 8); 
      } 
     } 
    } 
    if ($file) { 
     fclose($file); 
    } 
    if ($newf) { 
     fclose($newf); 
    } 
}