PHP Dateiupload
Hakan
- php
Hallo Leute,
nachdem ich durch dieses Forum schon sachen Programmiert habe, die ich sonst in 10 Jahren nicht geschafft habe, möchte ich wieder mal einer meiner Probleme hier posten in der Hoffnung wieder schnell eine Lösung zu finden.
Ich habe folgendes Problem, bzw. Vorhaben.
Ich habe ein Dateiupload mit PHP. DIe Datei wird ausgewählt und der Button zum hochladen wird geklickt. Die Datei wird in ein temp-Verzeichnis kopiert von dort per move_uploaded_file in das gewünschte File.
Jetzt zu meiner Frage:
Ist es möglich in einem Skript die Datei hochzuladen, die Datei nach bestimmten Kriterien prüfen und dann aber das move_uploaded_file in einem anderen Skript auszuführen?
Also das hochladen in ein Temp-Verzeichnis in einem Skript und das "moven" in einem anderen Skript.
Und wenn ja, was für Parameter muss ich dem neuen Skript übergeben??
Gruß, Hakan
Hi,
Ist es möglich in einem Skript die Datei hochzuladen, die Datei nach bestimmten Kriterien prüfen und dann aber das move_uploaded_file in einem anderen Skript auszuführen?
In zwei verschiedenen Scriptinstanzen: Nein.
(Die hochgeladene Datei wird nach Ablauf des Scriptes, welches beim Hochladen aufgerufen wurde, wieder aus dem Temp-Verzeichnis entfernt.)
MfG ChrisB
Hmm, das ist nicht die Antwort, die ich mir gewünscht hatte.
Aber es wären keine zwei Instanzen (was immer Du damit genau meinst). Es ist eine Session!!! Ändert das was?
Gruß, Hakan
Hi,
Ist es möglich in einem Skript die Datei hochzuladen, die Datei nach bestimmten Kriterien prüfen und dann aber das move_uploaded_file in einem anderen Skript auszuführen?
In zwei verschiedenen Scriptinstanzen: Nein.
(Die hochgeladene Datei wird nach Ablauf des Scriptes, welches beim Hochladen aufgerufen wurde, wieder aus dem Temp-Verzeichnis entfernt.)MfG ChrisB
Hi Hakan,
Hmm, das ist nicht die Antwort, die ich mir gewünscht hatte.
Aber es wären keine zwei Instanzen (was immer Du damit genau meinst). Es ist eine Session!!! Ändert das was?
Doch, es sind zwei verschiedene HTTP-Requests und somit i.d.R. zwei verschiedene PHP-Instanzen, welche den Ablauf verarbeiten ;-)
Was spricht dagegen, dass du das Bild mit move_uploaded_file() erst mal in einen weiteren temporören Ordner von dir kopierst, den Namen bzw. Pfad in der Session speicherst und dann im nächsten Script das Bild aus deinem eigenen temporären Ordner an das endgültigen Ziel schiebst?
Wobei mir kein Fall in den Sinn kommen will, wo das notwendig wäre… Vielleicht hast du auch nur einen gedanklichen Knoten in deiner Programmstruktur und dein Problem lässt sich anders und einfacher lösen?
Viele Grüße,
~ Dennis.
Ich hoffe dass die Uhrzeit an meiner Logikdenkweise Probleme verursacht.
Problem ist der, dass wenn jemand ein Bild hochladet, dann wird überprüft, ob es dieses bild bereits gibt. Wenns schon existiert, dann soll dem Nutzer eine Fehlermeldung angezeigt werden. Diese Fehlermeldung kann nur im auslösenden Skript angezeigt werden und auch nur ein einer bestimmen position (CSS-Formatiert).
Und genau hier soll der Nutzer die möglichkeit haben das Bild trotzdem hochzuladen und die existierende datei zu überschreiben.
(Also extra ein Button klicken)
So, ich dachte mir, Seite mit Form-Tag und Upload-Button -> Skript überprüft den Dateinamen. Datei existiert -> zurück zum Auslöser-Skript in der dem User mitgeteilt wird, dass er überschreiben kann. User sagt "überschreiben" und datei wird ge"moved". Aber dafür muss ja die Datei im Temp-Verzeichnis sein.
Gruß, Hakan
Hi Hakan,
Hmm, das ist nicht die Antwort, die ich mir gewünscht hatte.
Aber es wären keine zwei Instanzen (was immer Du damit genau meinst). Es ist eine Session!!! Ändert das was?Doch, es sind zwei verschiedene HTTP-Requests und somit i.d.R. zwei verschiedene PHP-Instanzen, welche den Ablauf verarbeiten ;-)
Was spricht dagegen, dass du das Bild mit move_uploaded_file() erst mal in einen weiteren temporören Ordner von dir kopierst, den Namen bzw. Pfad in der Session speicherst und dann im nächsten Script das Bild aus deinem eigenen temporären Ordner an das endgültigen Ziel schiebst?
Wobei mir kein Fall in den Sinn kommen will, wo das notwendig wäre… Vielleicht hast du auch nur einen gedanklichen Knoten in deiner Programmstruktur und dein Problem lässt sich anders und einfacher lösen?
Viele Grüße,
~ Dennis.
Hi,
Ich hoffe dass die Uhrzeit an meiner Logikdenkweise Probleme verursacht.
Ich hoffe, dass es nur an der Uhrzeit liegt, dass du dermassen bloedsinnig zitierst.
Bitte vermeide TOFU, Danke.
Und genau hier soll der Nutzer die möglichkeit haben das Bild trotzdem hochzuladen und die existierende datei zu überschreiben.
Der Nutzer hat das Bild schon beim ersten Mal hochgeladen - ihn das jetzt noch mal tun zu lassen, waere unsinnig - doppelter Traffic.
Sichere es dir also zu dem Zeitpunkt, wo er es erstmalig hochlaedt, zum spaeteren Zugriff.
Die Entscheidung, ob er damit eine bestehende Datei ueberschrieben haben moechte, kann er dann anschliessend treffen - dann kopierst du es halt von deinem Sicherungsort an den endgueltigen Zielort.
(Nur um das gelegentliche Entfernen gesicherter, aber anschliessend doch - explizit oder implizit - verworfener Dateien sollte man sich dann noch irgendwie kuemmern.)
MfG ChrisB
OK, was TOFU ist habe ich heute auch gelernt!
Naja, die Datei vorher auf einen von mir definierten Ort speichern ist mir zu aufwendig und auch nicht besonders geschickt, finde ich.
Aber der Vorschlag mit dem Checkbox finde ich nicht schlecht. Zumindestens ein klein bisschen userfreundlich. Besser als nix.
Trotzdem euch beiden vielen Dank zu später Stunde!
Gruß, Hakan
Hi Hakan,
Problem ist der, dass wenn jemand ein Bild hochladet, dann wird überprüft, ob es dieses bild bereits gibt.
Ok. Weshalb muss dies passieren? Woher wählst du überhaupt den Dateinamen für das Bild? Nimmst du den Dateinamen, den der Client dir in $_FILES['test']['name'] übermittelt? Dann prüfst du aber hoffentlich diese Angabe auch gegen gefährliche Zeichen! Oder?
Warum speicherst du die Bilder nicht einfach unter einem zufälligen Namen bzw. unter fortlaufender ID auf dem Server?
So, ich dachte mir, Seite mit Form-Tag und Upload-Button -> Skript überprüft den Dateinamen. Datei existiert -> zurück zum Auslöser-Skript in der dem User mitgeteilt wird, dass er überschreiben kann. User sagt "überschreiben" und datei wird ge"moved". Aber dafür muss ja die Datei im Temp-Verzeichnis sein.
Ich würde hier vermutlich so vorgehen, dass ich neben dem Upload-Feld für das Bild noch eine Checkbox setzen würde „Eventuell vorhandenes Bild gleichen Namens ohne Rückfrage überschreiben”. Aber eigentlich würde ich wie oben geschrieben, den vom Client gelieferten Dateinamen nicht zur Datenspeicherung verwenden, sondern höchstens bei der Ausgabe wieder dazuschreiben, wenn es unbedingt sein muss.
Gefällt dir das alles nicht, dann wirst du nicht darum kommen, wie bereits im letzten Posting von mir vorgeschlagen, die Datei aus dem TMP-Verzeichnis von PHP in ein von dir erstelltes TMP-Verzeichnis zu kopieren, wo du die Datei vorrübergehend aufbewahrst. Um die regelmäßige Bereinigung dieses Ordners müsstest du dich dann natürlich selber kümmern.
Viele Grüße,
~ Dennis.
PS: Unterlasse bitte TOFU.