PHP provides multiple ways to download and upload files to remote servers, such as fopen, fsockopen, cURL library, and other methods. fopen is the simplest but not the best. A while ago I wrote a function to fetch remote file by using fsockopen. However, I found a lot of problems when I use it. Then I read the PHP Cookbook and decided to try cURL library. After I implemented it in the independent class, it works like a charm. The following is the class source code.
// I adopt cURL library to download files // It is reliable and fast, less hassle than fopen/fsockopen etc. // this following three lines include testing code // $file = new Remotefile("http://downloads.pcworld.com/pub/new/patches___drivers/utilities/framxpro.zip"); // $file->save2file(""); class Remotefile { // the url components private $url = ""; // data get back from server private $header = array(); private $content = ""; private $extension = ""; function __construct($url) { $this->initialize($url); } private function curl_url() { $c = curl_init($this->url); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_HEADER, 1); $buffer = curl_exec($c); curl_close($c); // process data $rnrn = "\r\n\r\n"; $pos = strpos($buffer,$rnrn); if($pos === false) { // string $rnrn NOT found in $buffer echo "Something is not correct! "; } else { // string $rnrn found in $buffer $this->content = substr($buffer, $pos+4); $header = substr($buffer, 0, $pos); $this->processHeader($header); } } private function initialize($url) { // initialize all variables $this->url = $url; // fetch the remote file $this->curl_url(); } private function processHeader($header) { $lines = explode("\r\n", $header); $this->header["status"] = $lines[0]; foreach($lines as $line) { $data = explode(": ",$line); if ($data[1] != "") { $this->header[$data[0]] = $data[1]; } //echo "$data[0] |===| $data[1] "; } } private function redirectedURL() { return $this->header["Location"]; } private function getMIMEtype() { // check redirection url $rdurl = $this->redirectedURL(); if ($rdurl) { $ext = ereg_replace("^.+\\.([^.]+)$", "\\1", $rdurl); $this->extension = $ext; } else { $mtype = $this->header["Content-Type"]; $temps1 = split("/",$mtype); $temps2 = split(";",$temps1[1]); $ext1 = $temps2[0]; $this->extension = $ext1; if (($temps1[0] == "application")) { $ext2 = ereg_replace("^.+\\.([^.]+)$", "\\1", $this->url); if ($ext2) { $this->extension = $ext2; } } } $this->extension = trim($this->extension); //echo "file extension = ".$this->extension." "; } function getHeader() { return $this->header; } function getContent() { return $this->content; } function save2file($folder) { // write to file $this->getMIMEtype(); $filename = date('YmdHis').".".$this->extension; $target_path = getcwd(); if ($folder) { $target_path .= "/$folder"; } $target_path .= "/".$filename; $Handle = fopen($target_path, 'w'); fwrite($Handle, $this->content); fclose($Handle); return $filename; } } ?>
I adopt cURL library to download files. It is reliable and fast, less hassle than fopen/fsockopen etc. To use the above class, at Ubuntu yot have to install libcurl and php5-curl by the following command:apt-get install curl libcurl3 libcurl3-dev php5-curl
After this is done, just restart apache2 server by/etc/init.d/apache2 restart
No comments:
Post a Comment