norrodar
Goto Top

PHP-Script -Backup über FTP

- Verdindung zum FTP-Server wird erfolgreich aufgebaut
- Dateien werden erfolgreich eingelesen
- Ziel-pfad wird erfolgreich zusammengebastelt
-> Upload funktioniert nicht (keine Fehlermeldung, nur ein Warning)

Huhu liebe PHP-Freaks und was sich hier noch so alles tummelt :P

Ich hab mir ein Script gebastelt, welches ein lokales Verzeichnis komplett rekursiv einließt und dieses auf einen FTP-Server hochladen soll. Sozusagen als Backup, die Verzeichnisstruktur soll dann logischer Weise auf dem FTP-Server gleich abgebildet sein.

Es ist vielleicht ein bisschen verwirrend und nicht optimal (z.B. Zeichen ersetzen anstatt danach zu exploden usw.), aber seht selbst:

<?php

function dir_rekursiv($verzeichnis) { 
	$handle = opendir($verzeichnis);

	while ($datei = readdir($handle)) { 
		if ($datei != "." && $datei != "..") {   
			
			if (is_dir($verzeichnis.$datei)) {				// Wenn Verzeichniseintrag ein Verzeichnis ist
				$arr =dir_rekursiv($verzeichnis.$datei.'\\');		// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen  
				
				foreach ($arr as $key => $value) {
					$all = $value;
				}
			}
			else {											// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
				$all = $verzeichnis.$datei;
			} 
		}
    }
	closedir($handle);
	return $all;
} 



/* ********************************* */
	$ftp_server =	"ftp.server.de";  
	$benutzername =	"user";  
	$passwort =		"pwd";  
	
	$quelle =		"D:\\sys\\backup\\"; // am ende muss \\ stehen!  
	$ziel =			"/httpdocs/backup"; // unsicher ob Slash oder backslash - am Ende KEIN Back-/Slash  
/* ********************************* */

$fehler = "";  
$next = false;
$n = "\n";  
$quellcount = strlen($quelle);

 
$connection_id = ftp_connect($ftp_server);
 
$login_result = ftp_login($connection_id, $benutzername, $passwort);
ftp_pasv($connection_id, true);

if ((!$connection_id) || (!$login_result)) {
	$fehler = $fehler.$n."Ftp-Verbindung konnte nicht hergestellt werden!";  
	$fehler = $fehler.$n."Verbindung mit [".$ftp_server."] als Benutzer [".$benutzername."] nicht möglich!";	  
	$next = false;
}
else {
	$fehler = $fehler.$n."Verbindung hergestellt mit [".$ftp_server."] als Benutzer [".$benutzername."]".$n;  
	$next = true;
}

if ($next) {
	$fullpaths = dir_rekursiv($quelle);			// Verzeichnis komplett einlesen

	foreach ($fullpaths as $key => $value) {
		$nziel = substr($value, $quellcount); // Ab hier wird das \\ zum /
		$aziel = explode("\\", $nziel);  
		$kziel = "";  
		$rziel = "";  
		
		for ($i=0; $i < count($aziel); $i++) {
			$kziel = $kziel."/".$aziel[$i];  
		}
		$rziel = $ziel.$rziel.$kziel."\n";  
echo $rziel."\n";						// Testausgabe des   
		$upload = ftp_put($connection_id, $rziel, $value, FTP_ASCII);

		if (!$upload) {
			$fehler = $fehler.$n." - Fehler -> upload";  
		}
	}
}

ftp_quit($connection_id);

echo $fehler;

?> 

Ich habe jetzt schon mehrere Stunden mich dran probiert. Habe die Zielpfade umgeschrieben, das komplette Verzeichnis manuell abgebildet auf dem FTP-Server... ich weiß jetzt nicht mehr weiter.
Die Dateien werden nicht hochgeladen und eine Fehlermeldung bleibt ebenfalls aus. Nur ein Warning kommt durch:
"PHP Warning: ftp_put(): PORT command successful. in D:\ftp.php on line 73"

Seht Ihr vielleicht etwas, was ich übersehen hab(en) könnte? :S
Dankeschön und ein schönes WE euch allen! face-smile

Nira

Content-Key: 141862

Url: https://administrator.de/contentid/141862

Printed on: April 25, 2024 at 16:04 o'clock

Member: Snowman25
Snowman25 Apr 30, 2010 at 14:37:50 (UTC)
Goto Top
Hallo Niranda Sandra Laura Monique,

$upload = ftp_put($connection_id, $rziel, $value, FTP_ASCII);

schau mal hier: http://www.php.net/manual/en/function.ftp-put.php#89986
könnte es daran liegen?
Gruß
Snow
Member: Norrodar
Norrodar Apr 30, 2010 at 15:02:59 (UTC)
Goto Top
Hey, danke schön für deine schnelle Antwort face-smile

Es gab zwei Probleme:
Zum einen, was du geschrieben hast bzgl ASCII, es ist BINARY zu wählen.
Und etwas weiter oben hatte ich folgendes stehen:
$rziel = $ziel.$rziel.$kziel."\n";

Das ."\n" muss natürlich raus ;)

Es gibt's nur noch ein Problem:
Das Script muss Ordner vorher selbstständig erstellen, falls sie nicht existieren - ansonsten wird nix hochgeladen.
Member: Norrodar
Norrodar Apr 30, 2010 at 15:41:06 (UTC)
Goto Top
Der Vollständigkeit halber hier das lauffähige Script:
Dateien werden auf den FTP Server geladen.
Sollte ein Ordner nicht existieren, so wird dieser automatisch angelegt und gefüllt.

<?php

/*
 * Author: Niranda
 * Website: www.NiraPhone.de
 * Only with this Headline ffa
 */

function dir_rekursiv($verzeichnis) { 
	$handle = opendir($verzeichnis);

	while ($datei = readdir($handle)) { 
		if ($datei != "." && $datei != "..") {   
			
			if (is_dir($verzeichnis.$datei)) {				// Wenn Verzeichniseintrag ein Verzeichnis ist
				$arr =dir_rekursiv($verzeichnis.$datei.'\\');		// Erneuter Funktionsaufruf, um das aktuelle Verzeichnis auszulesen  
				
				foreach ($arr as $key => $value) {
					$all = $value;
				}
			}
			else {											// Wenn Verzeichnis-Eintrag eine Datei ist, diese ausgeben
				$all = $verzeichnis.$datei;
			} 
		}
    }
	closedir($handle);
	return $all;
} 


/* ============================================== */
/* ============================================== */

/* ********************************* */
	$ftp_server =	"ftp.server.de";  
	$benutzername =	"user";  
	$passwort =		"pwd";  
	
	$quelle =		"D:\\roteiro\\kdb_imp\\backup\\";	// Am Ende muss \\ stehen  
	$ziel =			"/httpdocs/backup";					// Am Ende darf kein / sein  
/* ********************************* */

$fehler = "";  
$next = false;
$n = "\n";  
$quellcount = strlen($quelle);

 
$connection_id = ftp_connect($ftp_server);
 
$login_result = ftp_login($connection_id, $benutzername, $passwort);
ftp_pasv($connection_id, false);					// true statt false => passiv-modus an

if ((!$connection_id) || (!$login_result)) {
	$fehler = $fehler.$n."Ftp-Verbindung konnte nicht hergestellt werden!";  
	$fehler = $fehler.$n."Verbindung mit [".$ftp_server."] als Benutzer [".$benutzername."] nicht möglich!";	  
	$next = false;
}
else {
	$fehler = $fehler.$n."Verbindung hergestellt mit [".$ftp_server."] als Benutzer [".$benutzername."]".$n;  
	$next = true;
}

if ($next) {
	$fullpaths = dir_rekursiv($quelle);			// Verzeichnis komplett einlesen

	foreach ($fullpaths as $key => $value) {
		$nziel = substr($value, $quellcount);
		$aziel = explode("\\", $nziel);  
		$kziel = "";  
		$dir = "";  
		
		for ($i=0; $i < count($aziel); $i++) {
			$kziel = $kziel."/".$aziel[$i];  
		}
		$rziel = $ziel.$kziel;
		
		@$upload = ftp_put($connection_id, $rziel, $value, FTP_BINARY);
		
		if (!$upload) {
		for ($j=0; $j < count($aziel)-1; $j++) {
			$dir = $dir."/".$aziel[$j];  
		}
		$dir = $ziel.$dir;
		
		ftp_mkdir($connection_id, $dir);
		$upload = ftp_put($connection_id, $rziel, $value, FTP_BINARY);
			if (!$upload) {
				$fehler = $fehler.$n.$rziel." - Fehler -> upload";  
			}
		}
	}
}

ftp_quit($connection_id);

echo $fehler;

?>