Fetch files from remote server automatically in PHP

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.

<?php
// completed and tested on Jan 6, 2010
// Author: Zhanshan Dong
// 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!<br />";
		}
		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]<br />";
		}
	}

	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."<br />";
	}

	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;
	}

}

?>
  • Share/Bookmark

Leave a Reply

You must be logged in to post a comment.