Paramterübergabe mit enctype="multipart/form-data"
Lars
- perl
hi,
ich habe ein file upload script - mit entsprechend vorausgehender html-seite, welches auch funktioniert.
nun moechte ich jene html seite von einem cgi generieren lassen und ihm weitere parameter uebergeben. soweit kein problem.
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.
vielleicht hat ja jemand eine Idee.
waere sehr dankbar
P.S.: ich benutze keine pm bibliotheken und habe auch nicht vor dies in diesem script zu tun. bitte beruecksichtigt dies.
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
Das ganze solltest Du jetzt auswerten. in der 'cgi-lib.pl' sind dafür ca. 140 Zeilen Code verantwortlich.
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
danke klaus, ich werds mal testen.
da ich noch nicht alzu lange damit herumspiele ist meine naechste frage die sich da auftut, kann ich denn -rein technisch gesehen- mein programmier"stil" mit modulen mischen, d.h. "frei" programmieren und dennoch auf module zurueckgreifen?
lars
Hallo Lars,
... kann ich denn -rein technisch gesehen- mein programmier"stil" mit modulen mischen, d.h. "frei" programmieren und dennoch auf module zurueckgreifen?
Ich weiß nicht genau, wasDu mit 'frei' programmieren meinst, aber es ist ja so, daß jeder irgendwie seinen eigenen Stil hat, Programme zu schreiben.
Wenn Du Module verwendest, dann mußt Du eigentlich nur aufpassen, daß Du die Modul-Schnittstelle richtig anwendest.
D.h. daß Du im Prinzip Module wie eine Spracherweiterung sehen kannst und Modul-Funktionen einfach gleich siehst wie 'print', 'open' usw.
Vielleicht ist es am Anfang leichter, nur prozedurale Module zu verwenden, weil es Dir sicherlich leichter fällt einfach neue Funktionen zu verwenden, als Dich gleich mit Objekten zu befassen. (das ist so meine Erfahrung aus der Zeit, als ich noch solche sachen unterrichtet habe)
Das Modul 'CGI.pm' hat dabei den Vorteil, daß man es so oder so anwenden kann.
Du solltest aber auf keinen Fall Angst aufkommen lassen. Ist alles am eEnde einfacher als es im ersten Augenblick aussieht.
Leichter wird eigentlich sowieso, weil Du Dich auf das konzentrieren kannst, was wirklich neu zu machen ist und die Routine-Arbeiten von Modulen erledigen lassen kannst.
Naja, kurz gesagt:
Wenn dein Programmierstil nicht absolt grausam ist (das glaub ich aber nicht), dann kannst Du sicherlich auch Module verwenden.
Also dann auf zu http://www.cpan.org und rein ins Vergnügen
Grüße
Klaus
Ich weiß nicht genau, wasDu mit 'frei' programmieren meinst, aber es ist ja so, daß jeder irgendwie seinen eigenen Stil hat, Programme zu schreiben.
ich lasse mich bei meiner programmiererei ungern von irgendwelchen fertigen modulen oder (script/code)bruchstuecken "behindern" - ich will zuerst einmal die eigenheiten der jeweiligen programmiersprache kennenlernen. spaeter, kann ich immer noch zurueckgreifen auf fertige programmteile, welche vornehmlich dann aus meiner feder sein sollten.
Wenn Du Module verwendest, dann mußt Du eigentlich nur aufpassen, daß Du die Modul-Schnittstelle richtig anwendest.
d.h. ich kann u.U. auch eine prozedur mit meinen eigenen code (siehe naechsten absatz (open, print)) verwenden und eine mit modul-technik?
D.h. daß Du im Prinzip Module wie eine Spracherweiterung sehen kannst und Modul-Funktionen einfach gleich siehst wie 'print', 'open' usw.
Vielleicht ist es am Anfang leichter, nur prozedurale Module zu verwenden, weil es Dir sicherlich leichter fällt einfach neue Funktionen zu verwenden, als Dich gleich mit Objekten zu befassen. (das ist so meine Erfahrung aus der Zeit, als ich noch solche sachen unterrichtet habe)
Das Modul 'CGI.pm' hat dabei den Vorteil, daß man es so oder so anwenden kann.
Du solltest aber auf keinen Fall Angst aufkommen lassen. Ist alles am eEnde einfacher als es im ersten Augenblick aussieht.
das habe ich schon bei anderen programmiersprachen gemerkt - habe vorher viel pascal und visual basic programmiert.
Leichter wird eigentlich sowieso, weil Du Dich auf das konzentrieren kannst, was wirklich neu zu machen ist und die Routine-Arbeiten von Modulen erledigen lassen kannst.
ich glaube aber, dass man nicht alles zu leicht machen sollte, da geht dann auch irgendwann der reiz verloren, wenn ich so gesehen nur copy & paste betreibe - auch wenn es nicht ganz c&p ist.
Naja, kurz gesagt:
Wenn dein Programmierstil nicht absolt grausam ist (das glaub ich aber nicht), dann kannst Du sicherlich auch Module verwenden.
ab wann ist er fuer dich grausam - das einzige, was ich ueber meinen eignen stil sagen kann ist, er entspricht etwa meinem leben bzw. meiner auffassung von der ordnung in dem zimmer, in dem meine rechner stehen ;-) - mal hier was angefuegt mal hier was rausgenommen oder einfach nur mal zu angucken hingestellt (# kommentare).
alles in allem aber fuer mich durchsichtig, und das ist m.E. das wichtigeste - oder irre ich mich da?
cu
Hallo Lars,
ich lasse mich bei meiner programmiererei ungern von irgendwelchen fertigen modulen oder (script/code)bruchstuecken "behindern" - ...
Behindern sollten sie Dich auf keinen Fall. Ist auch gar nicht deren Intention. Gewisse Dinge sind m.E. auch nur mit Moduln mit vertretbarem Aufwand erreichbar, oder willst Du jedesmal gleich eine Datenbank-Anbindung schreiben.
Außerdem kann man von anderen Scripts bzw. von Moduln ziemlich viel lernen. Da sind auch eine Menge wirklich kluger Köpfe am Werk.
Programmieren heißt für mich auch, gute Ideen zu erkennen und in meine Arbeit einfließen zu lassen. Da sind wir wieder beim Rad.
d.h. ich kann u.U. auch eine prozedur mit meinen eigenen code (siehe naechsten absatz (open, print)) verwenden und eine mit modul-technik?
Grundsätzlich ja. Es gibt nur ganz wenige Moduln, welche durch Seiteneffekte Probleme machen. ... Mir fällt so spontan eigentlich keins ein.
Und eigenen Code gibts immer zu schreiben.
ich glaube aber, dass man nicht alles zu leicht machen sollte, da geht dann auch irgendwann der reiz verloren,
Für mich liegt der eigentliche Reiz im begehen neuer Wege. Wenn ich weiß, daß da jemand Anderer sich schon Gedanken gemacht hat und tolle Lösungen entwicklte, dann hat's für mich eben nicht den Reiz mehr.
wenn ich so gesehen nur copy & paste betreibe - auch wenn es nicht ganz c&p ist.
Frei nach Larry:
'Das beste Werkzeug für den Programmierer ist copy & Paste.
Der Fluch jedes Programmierers ist copy & paste.'
Es intelligent einzusetzen ist sicherlich von Vorteil.
Übrigens: selbst einen Parser für CGI-Parameter zu schreiben ist auch nichts anderes als bestehendes zu kopieren. Nur deutlich mühseliger.
Sicherlich, oft will man genau das machen, um die Materie verstehen zu lernen.
ab wann ist er fuer dich grausam
Kann ich nicht so genau sagen. Da gibts viele Dinge die es ausmachen, ob's toll ist oder nicht. Ich weiß oft nicht mal ob mein Code das Gelbe vom Ei ist.
Wichtig ist, daß der Code es ermöglicht, später Erweiterungen einzubauen.
Ein guter Ansatz war für mich auch immer, alten Code anzusehen. Wenn ich mich schrecke, was ich da sehe, dann war das eben grausam.
Naja, das geht jetzt eindeutig in zum Thema 'richtiger Programmierstil' über, das vielleicht etwas für einen Themenchat sein könnte.
Im Endeffekt muß Du ja sowieso selbst entscheiden, wie Du's machen willst, da ist meine MEinung eigentlich gar nicht wichtig.
Grüße
Klaus
hi @klaus,
danke fuer deine hilfe.
warum soll denn auch nicht mal aus ner frage ein erfahrungsaustausch auch mal in ne andere richtung werden?
ich finds klasse.
ok nun zu meinem script: ich bin jetzt doch dem c&p-fluch erlegen, nach dem hundertsten testlauf habe ich die passage kurzum gekillt und durch nen modulaufruf ersetztz, muss nur noch ein bisschen "spielen" damit.
aber jetzt hab ich ne 2. frage:
wie kann ich denn einer von script generierten seite sagen in welchen frame sie soll, wenn ich es vorher im linktag nicht machen kann, da ich auf user eingaben reagieren will.
habe es mit <base target="myframe"> (in der neuen html ausgabe) probiert und es hat nicht geklappt. liegt es am browser? nn4.7
danke fuer bisherige tips
P.S.: ich benutze keine pm bibliotheken und habe auch nicht vor dies in diesem script zu tun. bitte beruecksichtigt dies.
Da hast Du auch ganz recht. Warum einfach, wenn es auch schwer geht?
Peter