Moin,
so, ich hier jetzt mal der Download von Dateien mit Umlaut-Konvertierung. Meine Architektur sieht so aus:
- Fritzbox als FTP-Server im homee eingerichtet (ich nutze keinen externen USB-Speicher sondern den internen Speicher vom Fritz-Nas > das Script löscht die Dateien auf der Fritzbox, sodass dort nie wirklich viel Speicherplatz benötigt wird)
- eigener Benutzer in Fritzbox angelegt, der nur Berechtigung für den zentralen homee-Ordner hat
- Webserver auf Synology-NAS, wo das PHP-Script liegt
Wie gesagt, ich habe null Ahnung von PHP, Webservern usw. und hab mir den Kram nur aus dem Internet zusammengesucht. Mag sein, dass Namenskonventionen nicht eingehalten werden oder sonstwas. Ob es sicherheitstechnisch so toll ist, nen Nutzer und nen Passwort direkt ins Script zu schreiben bzw. ob es anders geht, weiß ich auch nicht. Andererseits ist der Nutzer auf der Fritzbox auch nur für FTP zugelassen bzw. dort von den Berechtigungen her eingeschränkt.
Es tut bei mir das, was es tun soll, nämlich:
- Dateien von Fritzbox auf Webserver runterladen, welcher auf nem Synology-NAS läuft
- Genauer gesagt, wird die Funktion ftp_downloadAll rekursiv aufgerufen und dabei die komplette Ordnerstruktur aus dem Quellverzeichnis in das Zielverzeichnis übertragen (ich habe z.B. je einen Unterordner für das Backup und die Werte aus den Geräten im zentralen homee-Ordner der Fritzbox)
- Der Parameter $ftp_server_down beinhaltet die IP-Adresse der Fritzbox
- Der Parameter $ftp_user_name_down ist der Nutzername in der Fritzbox für den FTP-Download
- Der Parameter $ftp_user_pass_down ist das Passwort in der Fritzbox für den o.g. Nutzer
- $dir_remote beinhaltet den Root-Pfad in der Fritzbox (bei mir in der Fritzbox hat der Benutzer nur Zugriff auf den homee-FTP-Ordner und nicht auf das ganze Fritz-NAS, deswegen nur “.” als Wert)
- $dir_store beinhaltet die Pfadangabe für den Webserver, d.h. im konkreten Fall wird in dem Ordner, wo das Script liegt, ein Unterordner “tmp” angelegt und dort wird die komplette Ordnerstruktur aus der Fritzbox (homee-Ordner) erstellt bzw. die Dateien kopiert
- Die Dekodierung der Umlaute erfolgt mit dem Befehl utf8_decode
- Mit dem globalen Paramter _DELETESERVERFILES kann man steuern, ob die Dateien auf der Fritzbox gelöscht werden > da ich keinen externen Speicher an der Fritzbox habe, lösche ich die Dateien dort > es ist anzuraten, den parameter auf “false” zu setzen, während man testet (sonst sind die Dateien mit den komischen Symbolen weg und man muss erst wieder manuell welche rüberschaufeln, was ja bisher nur für Backups geht, wo es keine Umlaute gibt. Muss man also bis zum nächsten Tag warten…glaub mir, das nervt )
Code:
<?php
define("_DELETESERVERFILES", true); // delete files from ftp server after download
//****************************************************************************************************************************************
//Global parameters for download functions
//****************************************************************************************************************************************
$ftp_server_down = "192.XYZ.ABC.1"; //host name / ip of download server
$ftp_user_name_down = "fritz_box_download_user"; // Username download server
$ftp_user_pass_down = 'fritz_box_download_user_password'; // Password download server
$dir_remote = "."; //name of download folder of the download server / "." if directory is to be read from root
$dir_store = "tmp"; //name of download folder in PHP file root directory
$conn_id_down = ftp_ssl_connect($ftp_server_down)
or die("<span style='color:#FF0000'><h2>Couldn't connect to $ftp_server_down</h2></span>");
$login_result_down = ftp_login($conn_id_down, $ftp_user_name_down, $ftp_user_pass_down);
if ((!$conn_id_down) || (!$login_result_down)) {
die("<span style='color:#FF0000'><h2>You do not have access to this ftp server!</h2></span>");
}
//Call main function
$error = ftp_downloadAll($conn_id_down, $dir_remote, $dir_store, true); // Use "." if you want to download from root directory / second parameter specifies the download directory
//close FTP connection
ftp_close($conn_id_down);
function ftp_downloadAll($conn_id_down, $dir_remote, $dir_local, $firstcall)
{
$download_error = false;
$path = $dir_local . "/" . $dir_remote;
$path = utf8_decode($path);
/*
- this ensures, that all files are downloaded, also containing special characters like "ä,ö,ü",
but there might be no conversion (e.g. from Fritzbox) but "weird" symbols
- however, it works to download all files
*/
ftp_raw($conn_id_down, 'OPTS UTF8 ON');
if ($dir != ".") {
if (ftp_chdir($conn_id_down, $dir_remote) == false) {
//echo ("<BR>Change Dir Failed: $dir<BR>\r\n");
return;
}
if (!(is_dir($path))) {
mkdir($path);
}
chdir($path);
}
$contents = ftp_nlist($conn_id_down, ".");
foreach ((array) $contents as $file) {
if ($file == '.' || $file == '..') {
continue;
}
if (@ftp_chdir($conn_id_down, $file)) {
//if it is a subfolder > move to next folder-level by recursive call
ftp_chdir($conn_id_down, "..");
ftp_downloadAll($conn_id_down, $file, ".", false);
} elseif (!empty($file)) {
$file_utf8 = utf8_decode($file); //translate file name to UTF-8
if (ftp_get($conn_id_down, $file_utf8, $file, FTP_BINARY)) //download file
{
if (_DELETESERVERFILES == true) {
// try to delete file from server
if (ftp_delete($conn_id_down, $file)) {
} else {
$download_error = true;
}
}
} else {
$download_error = true;
}
}
}
if ($firstcall == false) {
ftp_chdir($conn_id_down, "..");
}
chdir("..");
return $download_error;
}
?>