FTP Backup - Umlauteproblem

Bei mir ist es z.B. so, dass das NAS nicht die ganze Zeit an ist (insbesondere nicht nachts), mein Fritzbox aber. Letztere nutze ich als FTP für die homee-Backups.

Per Webserver bzw. PHP-Script ziehe ich mir die Dinger dann in ne Datenbank und zur Ablage auf ein anderes Verzeichnis auf dem NAS (also im Prinzip: FTP-Download, Speichern in DB und FTP-Upload, wobei beim letzteres Quell- und Zielsystem quasi identisch sind, nur ne andere Ordnerstruktur). Am Ende wird dann noch nen Webhook abgeschossen, damit homee mich informieren kann, dass die Synchronisation zwischen Fritzbox und NAS abgeschlossen ist. Bin Laie bei PHP und hab mir das Script auch nur Dank des Internets zusammen geklimpert.

Worauf ich hinaus will: Beim ersten Schritt (Dateien von Fritzbox abholen) konvertiere ich die fehlerhaften Umlaute entsprechend im PHP-Script. Und wenn ich das sogar schaffe, dann schafft das jeder. :slight_smile:

2 „Gefällt mir“

Moin,

Und wenn Du das jetzt noch veröffentlichst, dann muß sich das nicht jeder Laie selber zusammen suchen :wink:

Viele Grüße
JayJay

2 „Gefällt mir“

Könnte ich, wenn ich zu Hause wäre bzw. mein NAS an wäre. Bin ich aber nicht bzw. ist es nicht :slight_smile: Aber da ich selbst Laie bin, übernehme ich natürlich keine Gewähr für irgendwas. Gucke aber, dass ich das Script bzw. die entsprechende Stelle später finde. Wie gesagt, ich habe null Ahnung von Webserver, PHP oder sonstwas, kann aber grundsätzlich programmieren.

Könnte aber sein, dass bereits der folgende Befehl das Problem löst:

http://php.net/manual/de/function.utf8-encode.php

Der Rückweg passt besser , du willst ja gerade keinen Unicode

http://php.net/manual/de/function.utf8-decode.php

Meine ich ja :slight_smile: Aber ja, das ist die Textzeile, um die Dateibezeichnungen beim FTP-Download zu konvertieren.

Danke @Kobold

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 :slight_smile:)

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;
}
?>
2 „Gefällt mir“

Ich hab den Code mal über vorformatierten Text besser lesbar gemacht…

Danke, hatte mich selbst schon gewundert, dass es dir Formatierung beim Einfügen zerschossen hatte - die Lösung dann aber auch selbst noch gefunden. Passierte dann wohl zeitgleich. :slight_smile:

Hallo,
ich habe einen Windows 2012-Server auf dem ich FTP eingerichtet habe. Homee schreibt schon seine Backups und die Verläufe. Leider sind die Verzeichnis- und Datei-Namen nicht richtig. Alle Umlaute sind falsch.

Umlaute

Wie kann ich die Umlaute richtig bekommen?

– Tolotos

Hi - Doppelposting ?

@coffeelover kannste hier zumachen

@Tolotos

Prüfe mal ob UTF8 eingeschaltet ist

allowUTF8 Optional Boolean attribute.

true if UTF8 is enabled; otherwise, false .

The default value is true .

https://docs.microsoft.com/en-us/iis/configuration/system.applicationhost/sites/sitedefaults/ftpserver/

allowUTF8 ist auf true.

Homee schreibt UTF 8, klappt zb mit Synology
Kannst du mal andren ftp Server testweise einsetzen ?

Ich lasse jetzt einmal auf meine Fritzbox schreiben. Morgen früh weis ich mehr.

Edit: So wie ich oben gelesen habe, wird das Ergebnis wohl genau so sein - keine vernünftigen Umlaute.

Edit2: Ich habe jetzt eine Linux VM unter HyperV laufen um die Umlaute zu testen.

Hat eigentlich irgendjemand schon auf einer nicht Synology mit UTF8 erzwingen erfolgreich Backups mit Umlauten hingekriegt?

@homee @Chris Ich glaube ich habe das Problem gefunden. Könnt ihr bitte eure FTP-Client Implementierung ansehen ob das Kommando “OPTS UTF-8 ON” gesendet wird?

Ich habe das mit meinem Windows FTP-Server verifizieren können.

ftp win-ftp-server

quote mkd öäü ==> geht schief
quote opts UTF-8 ON
quote mkd öäü ==> jetzt geht es
quit

Hier habe ich den Tip gefunden:
https://wiki.filezilla-project.org/Character_Encoding#Conflicting_specification

Gruß Tolotos

1 „Gefällt mir“

Ich habe das ganze an die Kollegen vom Core Team weiter gereicht. Wir überprüfen das.

1 „Gefällt mir“

Zwei Wochen sind um. Was hat die Überprüfung denn ergeben? Wenn sie wirklich durchgeführt wurde.

Wie du am Status “aufgenommen” erkennen kannst, haben wir das Problem erkannt und es wird in einer zukünftigen Version behoben.

1 „Gefällt mir“

Cool, und was ist den mit den “aufgenommenen” issues die seit August 16 dort stehen ?

3 „Gefällt mir“