Gemischte <FORM>- Eingaben
snr
- perl
Hallo da draussen,
Nachdem ich für die Gestaltung unserer Homepage bisher immer Hilfe im selfHTML- Buch bzw. in den Forenarchiven gefunden habe, hätte ich da mal eine Frage:
Ich möchte folgendes realisiren:
Was schon geht:
Ich kann den Text übertragen, auswerten, und abspeichern, sowie auslesen und auf einer neuen Seite anzeigen. Ich kann auch die Bilder hochladen, aber beides zusammen geht natürlich nicht.
Was nicht geht:
Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.
Man könnte das natürlichmit fertiger Software realisieren,aber ich möchte es lernen und unssre kleine Gebrauchtmaschinenbörse selbst programmieren.
Also bitte keine diesbezüglichen Hinweise, es gibt sowas sicher schon...
MfG
SNR
Hi,
Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.
dann ist Deine Auswertung falsch.
Cheatah
Hi,
Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.
dann ist Deine Auswertung falsch.
Cheatah
@Cheatah:
Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?
Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
-----------------------------------------------------
# Variablen
...
#
# Einlesen der vom Formular uebermitteleten Daten
#
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
read(STDIN, $form_data, $ENV{'CONTENT_LENGTH'});
}
else
{
$form_data = $ENV{'QUERY_STRING'};
}
#
# Daten decodieren
#
# Daten Splitten (nach Trenner "&")
@data_split = split(/\&/,$form_data);
#
# Trennen der Eingabedaten von den Bezeichnungen
$i = 0;
foreach(@data_split)
{
($data_var[$i],$data_write[$i]) = split(/\=/,$data_split[$i]);
$i++;
}
......
---------------------------------------
Ist da schon ein kapitaler Fehler? Denn in "$data_write[$i]" kommen die Bilddaten ab Indexposition $i=<1 an.
Wenn ich den "enctype" weglasse, dann funktioniert das, aber es kommen natürlich nur die Pfad-/Dateinamen der Bilder in der Variable an, logisch!
MfG
SNR
Hi,
Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?
ja.
Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
if ($ENV{'REQUEST_METHOD'} eq "POST")
Sag ich ja. Benutze das Modul "CGI".
Cheatah
Hi,
Danke für die schnelle Antwort! Ich verstehe das erstmal so, dass man die Daten so übertragen kann (gemischt: binär und text)?
ja.
Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
if ($ENV{'REQUEST_METHOD'} eq "POST")Sag ich ja. Benutze das Modul "CGI".
Cheatah
@Cheatah:
Ich schon wieder, was meinst Du mit "CGI" benutzen? Das hier: http://aktuell.de.selfhtml.org/artikel/cgiperl/file-upload/
oder im Perl- Dateiheader das hier:
#!/usr/bin/perl
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
~~~?
Danke
snr
Hi,
Hi,
bitte zitiere nur das, worauf Du Dich beziehst, danke.
@Cheatah:
Das brauchst Du nicht zu erwähnen, da es bereits durch den Umstand klar wird, dass Du auf einen von mir verfassten Artikel antwortest. Wenn Du jemand anderen als mich hättest ansprechen wollen, wäre dessen Erwähnung sinnvoll.
Sag ich ja. Benutze das Modul "CGI".
was meinst Du mit "CGI" benutzen?
"CGI benutzen" heißt auf Englisch "use CGI". Exakt dies findest Du sowohl auf der von Dir genannten Seite, als auch im von Dir genannten Code-Schnipsel. Wenn Du nicht weißt, wie damit umzugehen ist, gibt es zunächst einmal nur eins:
Konsultiere die entsprechende Seite der Dokumentation.
Sollten wider Erwarten anschließend noch Fragen offen sein, wirst Du hier auf bereitwillige Helfer stoßen.
Cheatah
[...] von mir verfassten Artikel [...]
Aufschneider ;)
Siechfred
Hier mal einen kurzen Ausschnitt aus den ersten "Auseinanderfummlen" der Daten:
Das ist das Problem: Du versuchst, eine Kokosnuss mit einer Nagelfeile zu knacken. Du gehst davon aus, dass der Body des POST-Requests bei "gemischten" Formularen nach dem selben Schema aufgebaut ist wie ein Querystring bei GET-Requests. Das ist aber falsch, wie Du bei einem Blick in RFC 1867, sec. 6 feststellen wirst. Spätestens an diesem Punkt solltest Du Dir wirklich gut überlegen, ob Du Dir das Parsen von Hand wirklich antun möchtest... ;)
Siechfred
Was schon geht:
Ich kann den Text übertragen, auswerten, und abspeichern, sowie auslesen und auf einer neuen Seite anzeigen. Ich kann auch die Bilder hochladen, aber beides zusammen geht natürlich nicht.
Was nicht geht:
Wenn ich in das <FORM>- Tag den "enctype=multipart/form-data" setze, dann kann ich die Texteingaben nicht mehr decodieren, da ja das ganze im Uploadmodus übertragen wird. Ich bekomme dann nur in der ersten Variablen alle Form- Daten (nicht dekodiert) und danach die Bilddaten.
Ein Hinweis.
Browser neigen immer mehr dazu, dass das <input type=file> Element nur noch über die File-Auswahl zu steuern ist, und ein Löschen der Eingabe weder manuell noch via JS möglich ist. In diesem Falle würde ein reset Button notwendig sein, der aber alle Formulardaten löscht, was für einen Poster in einem früheren Thread ein Ärgernis darstellte.
Aus diesem Gedankengang komme ich zum Ergebnis, dass man fileupload und weitere Daten zu diesem File tunlichst trennen sollte, das heisst, die Akzeptanz des Files von der Validität der in einem späteren submit gestellten Daten abhängig machen sollte (oder umgekehrte Submit Folge).
Nimmt wich Wunder, was andere dazu meinen.
mfg Beat
Man könnte das natürlichmit fertiger Software realisieren,aber ich möchte es lernen und unssre kleine Gebrauchtmaschinenbörse selbst programmieren.
Also bitte keine diesbezüglichen Hinweise, es gibt sowas sicher schon...
Wenn du mit Perl eine Anwendung programmieren möchtest solltest du bzw. musst du dich mit den Modulen beim CPAN auseinandersetzen. Da du erst bei den Grundlagen bist, scheint es für dich vielleicht übertrieben zu sein für so eine "einfache" Sache ein 200KB grosses Modul einzubinden, aber schon bei deiner konkreten Frage wirst du es schwierig haben und lange brauchen bis das funktioniert was du da vor hast. Module sind keine fertige Software sondern Komponenten von Perl. Kurz gesagt use CGI;!
Und noch wichtiger!!!
Benutzte use strict und lass dir die Warnungen ausgeben, z.b. mit dem Schalter -w, ansonsten wirst du mit deinem Skript nie fertig (es sei den du bist der geniale Programmierer)
Struppi.