klaus: Paramterübergabe mit enctype="multipart/form-data"

Beitrag lesen

hallo,

das problem beginnt damit das die o.g. html seite im enctype="multipart/form-data" gepostet werden muss, damit der filetransfer zustande kommt. leider kann ich nicht die ihm vorher uebergebenen parameter mit uebergeben bzw. spaeter auslesen, was aber zwingend notwendig waere.

wieso ist das ein Problem, Du kanns das analg zu Deinem File-upload auswerten. Ist aber eine ziemliche arbeit

1.) in $ENV{'CONTENT_TYPE'} steht nicht nur der encttype drin, sondern (bei multipart auch der Boundary-string.
z.B.:
   type = multipart/form-data; boundary=---------------------------22996202119275;
alles zwischen '=' und';' ist der Boundarystring, der allerdings immer wieder anders ist
in unserem Falle also
   '-----------------------------22996202119275'

2.) in $ENV{CONTENT-LENGTH} steht drin vieviele Bytes zu lesen sind. diese holst Du dir per 'read' von STDIN ab.
(Achtung unter Windows solltest Du vorher unbedingt binmode(STDIN) ausführen, weil sonst hast Du Probleme

3.) wenn Du alles gelesen hast, dann gehts ans analysieren (kannst Du natürlich auch gleich beim einlesen machen.
jeder Block(Part) beginnt mit de rboundary und endet wenn ein neuer Block beginnt. der letzte Block wird auch mit der Boundary beendet, jedoch sind bei dieser zusätzlich zwei Bindestriche angefügt. das signalisiert, daß jetzt kein block mehr kommt.

Das ganuze kann so aussehen:
<output starts here>
-----------------------------22996202119275
Content-Disposition: form-data; name="TEXTFELD"

testtext
-----------------------------22996202119275
Content-Disposition: form-data; name="UPLOADFELD"; filename="E:\muell\x.txt"
Content-Type: text/plain

hier beginnt der inhalt der datei
ddfsadf
dfasfdsasdf

dfasda

adsfasfa

afdsadsfa
hier endet der inhalt der datei

-----------------------------22996202119275
Content-Disposition: form-data; name="B_OK"

senden
-----------------------------22996202119275--
<output ends here>

Jeder Block beginnt mit Zeilen, welche den inhalt beschreiben und einer Leerzeile.
in Zeile, welche mit 'Content-Disposition', steht unter anderem auch der Name des Eingabefeldes aus Deinem Formular.

alle restlichen Zeilen beinhalten den Wert.
Außerdem solltest Du nicht vergessen, das das ganze auche encodet ist, also solltest Du die Werte unbedingt vorher decoden.

Das ganze solltest Du jetzt auswerten. in der 'cgi-lib.pl' sind dafür ca. 140 Zeilen Code verantwortlich.

vielleicht hat ja jemand eine Idee.

Ja, am besten Du verwendest ein Modul/Bibliothek wie 'CGI.pm' oder cgi-lib.pl'. Warum das Rad eigentlich neu erfinden?
Du kannst natürlich auch die angegebenen Bibliotheken durchsehen und das, was Du brauchst  in Deinen Code übernehmen, wenn du partot keine Bibliotheken verwenden willst, können tust Du immer.

Viel Glück
Klaus