File nach weiterem Request erneut hochladen

  • Guten Abend,


    ich habe mal wieder ein Problem mit PHP. Und zwar bin ich gerade dabei ein kleines FTP-Tool zu bauen.


    Folgendermaßen ist es aufgebaut:


    1. File-Upload-Form wird ausgefüllt und abgesendet
    2. Überprüfung und Validierung der Dateien
    3. Speicherung der Dateien
    4. Wenn Fehler aufgetreten sind, wird eine Übersichtstabelle erstellt inkl. zwei Buttons, um auszuwählen, wie es weitergehen soll. (Alle, die hochladbar sind, hochladen oder Ausgewählte hochladen)
    5. Klick auf "Alle hochladen", per Post und hidden-Feld werden hochladbare Dateien übergeben
    6. Dateien werden nochmals hochgeladen



    Das Problem, dass ich habe, befindet sich bei Schritt 6. Nämlich können die Dateien aus irgendeinem Grund nicht hochgeladen werden. Da move_uploaded_file false zurückgibt und alle Parameter richtig sind, liegt es vermutlich daran, dass ja der tmp_file nach dem erneuten Request nicht mehr existiert oder etwas ähnliches.


    Ich habe bereits versucht da entgegenzuwirken und nach dem zweiten Request einfach ein neuen tmp_file erstellt, aber irgendwie scheint das auch nicht zu funktionieren.


    Wahrscheinlich liegt das Problem also doch woanders. Daran, dass der Superglobal $_FILES leer ist, liegt es ebenfalls nicht, da eine Füllung von diesem, auch kein positives Ergebnis mit sich bringt.


    Letztendlich vermute ich jetzt, dass der File-Upload nur gelingen kann, wenn PHP die Daten über das File-Upload-Formular bekommt und nicht über diese Umwege.


    Wenn meine Vermutung richtig liegt, würde mich interessieren, ob ich das irgendwie umgehen kann. Falls es das nicht ist, wäre es natürlich super, wenn jemand den eigentlichen Grund weiß.


    Bin mit meinem Wissen gerade echt etwas am Limit.


    Hier ist der Code:


    ftp-tool.php


    functions.php


    Schon mal danke im Voraus. :)


    Gruß
    JR Cologne

  • Ich bin gerade zu faul den nicht kommentierten Code durchzuarbeiten. Was heißt für dich "Wenn Fehler aufgetreten sind"? Fehler beim Upload oder Fehler nach dem Upload.


    Ich würde wie folgt vorgehen:


    Alle Dateien werden hochgeladen und in ein temporäres Verzeichnis gespeichert. Dateien werden auf Fehler geprüft welche dem Benutzer angezeigt werden. Dann kommt deine Fehlertabelle mit deinen Buttons. Die Dateien müssen dann nicht neu hochgeladen werden (kein neuer Traffic) sondern können Serverintern verarbeitet werden. Fehlerfreie Dateien können in das gewünschte Verzeichnis verschoben werden und fehlerhafte Dateien können gelöscht werden.


    Falls ich das Problem nun völlig falsch verstanden habe tut mir das leid :)


    Für dich interessante Funktionen:
    mkdir - Erstellt ein Verzeichnis
    rmdir - Löscht ein Verzeichnis
    rename - Kann Dateien inklusive Pfad umbenennen (verschieben)
    unlink - Löscht Datei
    chmod - Ändert Dateiberechtigung (Um eventuell unberechtigten Zugriff auf ungeprüfte Dateien zu verhindern und sie nach Prüfung freizugeben)

  • Ich bin gerade zu faul den nicht kommentierten Code durchzuarbeiten. Was heißt für dich "Wenn Fehler aufgetreten sind"? Fehler beim Upload oder Fehler nach dem Upload.


    Beim Upload/Speichern ist ein Fehler aufgetreten, da move_uploaded_file() false zurückgibt.


    Das mit dem Code kann ich verstehen. Werde morgen mal ein paar mehr Kommentare hinzufügen...


    Ich würde wie folgt vorgehen: [...]


    Die Idee hört sich nicht schlecht an, aber ich verstehe nicht ganz, warum das keinen neuen Request benötigt. Denn sobald ich auf einen der Buttons klicke, habe ich dann doch einen neuen Request, oder verstehe ich gerade was falsch?


    Bin mir nicht ganz sicher, ob wir auf dem gleichen Nenner sind. Werde das morgen nochmal versuchen zu erklären. Jetzt bin ich zu müde dafür. :D

  • Wenn du alle Dateien beim ersten Upload abspeicherst sind sie auf deinem Server und können unabhängig vom Client abgefragt werden.


    Fehlgeschlagene Uploads erneut initiieren macht keinen Sinn, da sie wieder fehlschlagen werden.

  • Nein, das möchte ich ja auch gar nicht. Ich möchte nicht die fehlgeschlagenen Dateien erneut Hochladen, mir geht es darum, die nicht fehlgeschlagenen Dateien rauszupicken (was schon passiert) und dann erneut hochzuladen. Und genau bei diesem zweiten Upload, liegt das Problem.


    Denn dafür, dass der User per Button auswählen kann, was mit den Dateien passieren soll (alle, die möglich sind, hochladen oder nur Ausgewählte hochladen) brauche ich einen neuen Request (außer ich nutze JS, aber das kommt nicht in Frage) und danach gibt es die tmp-Dateien natürlich nicht mehr. Das gleiche gilt für den Superglobal $_FILES.


    Dieses Problem habe ich dann versucht zu beheben, indem ich die Buttons in ein Formular gepackt und die Dateien versteckt übertragen habe und nach dem Request wieder entgegengenommen habe.


    Auch das funktioniert leider nicht, denn move_uploaded_file() gibt false zurück und ich bekomme meine Fehlermeldung, dass der Upload/das Speichern gescheitert ist. Wichtig ist dabei zu erwähnen, dass alle Daten in der Funktion ankommen.


    Daher habe ich eben geschlossen, dass das Problem bei den tmp-Dateien liegt, die dann halt nicht mehr vorhanden sind.


    Ich könnte also entweder, wie du sagst, ein Verzeichnis anlegen und die Dateien dort zwischenspeichern oder ich erstelle ganz einfach eine neue tmp-Datei, allerdings muss ich die dann vermutlich erstmal mit Daten füllen, damit es funktioniert. Bei diesen beiden Varianten gehen wir auf jeden Fall davon aus, dass es an den tmp-Dateien liegt.


    Eine weitere Vermutung von mir wäre, dass der Upload nur funktioniert, wenn der Request über ein File-Upload-Form ausgeführt würde. Keine Ahnung, warum, aber das halte ich für die einzige Alternative zu dem eben genannten. Wie man dem umgehen kann, weiß ich nicht.


    So, ich denke, ich werde auf jeden Fall mal deinen Tipp ausprobieren. Und danke dir für deine Hilfe. :)


    Leider ist der Text ein bisschen länger geworden, aber hoffentlich haben wir damit jetzt alle Verständnisprobleme ausgeräumt. :D

  • Die beiden von dir genannten Methoden sind identisch, abgesehen davon, dass "eine neue tmp-Datei anlegen" aufwändiger ist.


    Speichere einfach die erfolgreich hochgeladenen Dateien in ein temporäres Verzeichnis, speichere den Status jeder Datei + Namen in einer Session und dann kannst du nach dem neuen Request damit weiterarbeiten.


    Etwas in die Richtung (nicht übernehmen, ist lediglich Pseudocode):


  • Die $_SESSION könnte/wird nach einem Browser neustart weg sein.(gewollt oder ungewollt)
    Man könnte Cookies verwenden, um die Dateien später wieder zu finden.
    Oder noch besser in die db. Der User hat sicherlich ein Profil.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!