Scripts

Remote Copy

Even een functie voor als je een bestand van een andere server naar je eigen wilt kopiƫren. Hij is gemaakt voor plaatjes, maar andere bestanden zouden in principe ook moeten kunnen. Gebruik: retrieve( $remote_filename , $home_filename , $autocomplete ) $remote_filename: URL naar het bestand op de andere server. $home_filename: Bestandsnaam, of map indien $autocomplete true is waar het bestand moet worden opgeslagen. $autocomplete: Als deze waarde true (standaard) is, wordt $home_filename de directory waar het bestand in wordt opgeslagen, en de bestandsnaam blijft hetzelfde als die van het bestand toen het nog op de server stond. Indien false, moet je in $home_filename de hele bestandsnaam invullen. (ook extensie) Voorbeeld: Changelog: 7 juli 2005: 'Memoryleak' eruit gevist. Hij slaat nu meteen op terwijl hij het bestand naar binnen trekt. Bij grote bestaden (groter dan 1MB) zou dit een heleboel werkgeheugen besparen, en een snelheidswinst moeten opleveren. 8 december 2007: Request veranderd van HTTP/1.1 naar HTTP/1.0 aangezien het script niet om kan gaan met chunked antwoorden. Documentatie http://doc.ikhoefgeen.nl/?n=Scripts.RemoteCopy

remote-copy
<?php
function retrieve($remote_filename, $home_filename, $autocomplete = true)
{
	$awnser = '';
	$headers = array();
	$status = '';
	$headerstopped = false;
	$fileId = 0;
	$size = 0;
	
	$url = explode('/', $remote_filename);
	if($url[0] == 'http:' OR $url[0] == 'https'){
		$url = array_slice($url, 2);
	}
	if($autocomplete){
		$home_filename .= $url[count($url)-1];
	}
	
	if(!$filehandle = fopen($home_filename, 'w')){
		trigger_error('Could not create file', E_USER_ERROR);
		return false;
	}else{
		if(!$handle = fsockopen($url[0], 80, $errno, $errstr, 30)) {
			trigger_error("$errstr ($errno)", E_USER_ERROR);
			fclose($filehandle);
			return false;
		}else{
			$out = "GET /".implode('/', array_slice($url, 1))." HTTP/1.0\r\n";
			$out .= "Host: ".$url[0]."\r\n";
			$out .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; nl-NL; rv:1.7.8) Gecko/20050511 Firefox/1.0.4\r\n";
			$out .= "Connection: Close\r\n\r\n";
			fwrite($handle, $out);
			while (!feof($handle)) {
				if(!$headerstopped){
					$awnser .= fgets($handle, 8192);
					if(stristr($awnser, "\r\n\r\n")){
					list($header, $data) = explode("\r\n\r\n", $awnser);
						$header = analizeHeader($header);
						if(stristr($header['Status'], '200 OK')){
							$headerstopped = true;
							unset($awnser);
						}else{
							if(stristr($header['Status'], '400')){
								trigger_error('Bad request', E_USER_ERROR);
							}
							elseif(stristr($header['Status'], '404')){
								trigger_error('File not found', E_USER_ERROR);
							}
							unset($awnser);
							fclose($handle);
							fclose($filehandle);
							return false;
						}
					}
				}else{
					$buffer = fgets($handle, 8192);
					fwrite($filehandle, $buffer);
					$buffer = NULL;
				}
			}
			fclose($handle);
			fclose($filehandle);
			return $home_filename;
		}
	}
}

function analizeHeader($header)
{
	$headers = array();
	foreach(explode("\r\n", $header) as $value){
		if(stristr($value, ': ')){
			list($key, $value) = explode(': ', $value);
			$headers[$key] = $value;
		}else{
			$headers['Status'] = $value;
		}
	}
	return $headers;
}
?>

Reacties

0
Nog geen reacties.