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-curlAfter this is done, just restart apache2 server by/etc/init.d/apache2 restart
No comments:
Post a Comment