Klaus Mock: mehrere Dateien im Binärmodus hochladen

Beitrag lesen

Hallo,

hab da mal wieder ne Frage, und zwar ich wollte ein Bildermanagement in Perl schreiben. Wenn ich nun ein Bild hochladen will, dann geht das, wie man hier in diesem Code Schnipsel sieht ganz einfach:

Na, so einfach ist es auch wieder nicht, das was Du hier verwendest ist, gelinde gesagt, ziemlich abenteuerlich.

@parts = split /-----------------------------.{9}/, $formdata;

Ist dir klar, daß bei multipart/formdate der Client die Boundary im Content-Type des HTTP-Requests angeben _muß_, sofern er ein HTTP-Client sein will?

Diese übertragene Boundary, und nur diese, ist vom Serverscript als Trennung zwischen den einzelnen Parts zu werten, wobei Boundary+"--" das Ende des letzten Parts bezeichnet.

if ($_ =~ "Content-Type: image/") {

Jeder Part hat selbst einen eigenen Header-Bereich, welcher auch entsprechend ausgewertet werden will. Eine Annahme, wie, und vor allem in welcher Reihenfolge diese Header übertragen werden, entspricht nicht dem Standard, und ist somit ungeeignet für einen krisensicheren Abarbeitung des Requests.
Der Header für Content-Disposition wird immer übertragen, der Content-Type nur bei Dateiübertragung.

@file = split /\n/, $_, 5;

Hier nimmst Du etwas an, was u.U. funktionieren kann, aber nicht muß.

So weit sogut, "$uploadfile" wird nun in eine Datei geschrieben, das wars :)

Na, gut ist etwas anderes. Wenn Du wissen willst, _wie_ so etwas wirklich ordentlich gemacht wird, sieh Dir den Code von CGI.pm oder meinetwegen cgi-lib.pl (wobei ich da auch meine Bedenken habe) an. Die halten sich an die entsprechenden Spezifikationen.

Am besten wäre es, gleich auf das CGI-Modul zurückzugreifen, wobei allerdings eventuell der sportliche Wert verloren geht.

Jetzt wollt ich aber nicht nur eine Datei hochladen, sondern gleich mehrere. Hat da vielleicht jemand kurz n kleinen Tipp, wie man sowas realisieren könnte?

Zwei Möglichkeiten: Speichere jede hochgeladene Datei gleich in die entsprechende Zieldatei. Das ist die resourcenschonendste Methode.
Alternativ kannst Du perleigene Datenstrukturen wie Hashes oder Arrays verwenden, um DIe Dateiinhalte und MEtadaten wie Dateinamen im Speicher zu halten.

Ps: für dieses Skript werden keine Module verwendet.

<cite src="Toni Polster">Jo, des schdimmt!</cite>

Grüße
  Klaus