Alexander (HH): IO bzw. CGI.pm Upload speichern

Beitrag lesen

Moin Moin!

Nee, CGI möchte es bevorzugt in ein tmp-verzeichnis im Home des ausführenden users schreiben. (RTFM ...SCNR ;)

"1. if the current user (e.g. "nobody") has a directory named              "tmp" in its home directory, use that (Unix systems only)"

grep nobody /etc/passwd
nobody:x:99:99:nobody:/:

Und nur mal so am Rande läuft der Apache nicht unbedingt als nobody:

grep www /etc/passwd
www:x:97:97:Apache run account:/:/bin/false

Nun, da wir die Home-Verzeichnisse von nobody und www kennen, sag mir doch bitte mal, wie der absolute Pfad von "'tmp' in its home directory" ist.

Man sollte also das Home des Users auf der gleichen Platte wie die Uploads haben.

Falsch. Man sollte nicht davon ausgehen, dass die Temp-Dateien an irgendeiner nützlichen Stelle liegen.

Ich bleibe dabei, CGI.pm wäre besser wenn es eine link() Methode hätte.

link() funktioniert nur innerhalb eines Dateisystems, und längst nicht auf jeder Plattform.

Die Schnittstelle würde den häufigsten Anwendungsfall von Uploads erschlagen [*] , es wäre Performanter und der Anwender bräuchte sich darüber keinen Kopp zu machen. Außerdem könnte CGI so die Sonderfälle der "tmpfileverbergen"-Problematik besser greifen.

In der Tat wäre eine andere Schnittstelle hilfreich. Insgesamt hat sich im CGI-Modul jede Menge Chaos und krampfhafte Rückwärtskompatibilität zu kaputten Scripten angesammelt, und einige Techniken sind mindestens problematisch (Mischen von Konfiguration, Parametern und File-Parametern in einem Hash, Hilfsklassen ohne CGI::-Prefix, ...). Ich habe in den letzen Monaten mehrmals überlegt, das CGI-Modul von Grund auf neu zu schreiben, mit annähernd gleicher Schnittstelle zum Script, aber mit mehr Ordnung und Struktur hinter den Kulissen.

Hilft Dir aber nicht. Denn es ist kein Apache::Upload-Objekt, es bietet nur eine ÄHNLICHE Schnittstelle.

Tja aber ich werde mich auch hüten eine undokumentierte Routine von CGI zu nutzen um ans Tmpfile zu kommen... ;)

Das haben schon viele andere getan, was mit eine Ursache für die Probleme des CGI-Moduls ist. So lange Du die Umgebung kontrollieren kannst, hätte ich dabei keine Skrupel. Wenn Dich die Paranoia beißt, schreibst Du am Anfang des Scriptes sowas wie CGI->can("tmpFileName") or die "Oooops, CGI.pm is broken.\n";

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".