Schrift
[thread]12452[/thread]

Formular Array im Content POSTen

Leser: 2


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
IceRage
 2008-09-07 17:27
#114321 #114321
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Hallo allerseits,

ich versuche wie folgt Formulardaten per POST zu senden. Im Formular ist ein Array enthalten, dass: name="userfile[]" heißt. Wenn ich jetzt eben diesen Namen im Content benutze, und 2 Zellen des Arrays somit mit Werten füllen will, bekomme ich die Rückmeldung, dass ein Fehler aufgetreten ist, weil mindestens 1 userfile hochgeladen werden muss. Das nur so nebenbei ... Meine Frage ist eigentlich: Wie muss der Content-String ($content) für Arrays aussehen?


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
        $content = "type=direct&userfile[]=";
        $content .= "$directory\\".@werte[$i];
        $content .= "&userfile[]=";
        $content .= "$directory\\".@anderewerte[$i];
        print "\n".$content."\n";
        $contlen = length($content);
        $req = HTTP::Request->new("POST", "http://bigpichost.de/upload.php");
        $req->header("content-type" => "application/x-www-form-urlencoded");
        $req->header("content-encoding" => "iso-8859-1");
        $req->header("connection" => "close");



LG, IceRage
murphy
 2008-09-07 18:03
#114322 #114322
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Das Datenübertragungsformat application/x-www-form-urlencoded kennt an sich keine Arrays, sondern nur Paare aus Schlüssel- und Wertzeichenketten.

Wie man in dieser Kodierung ein Array überträgt hängt davon ab, wie der Empfänger (also vermutlich ein CGI-Skript) die Daten interpretiert. Häufig ist es so, dass bei mehrfach wiederholten Schlüsseln alle Werte in einem Array gesammelt werden, so dass Du vielleicht mit folgendem Ansatz Erfolg haben könntest:
Code (perl): (dl )
1
2
3
4
5
use URI::Escape;

[...]

$content .= '&userfile[]=' . uri_escape($_) for (@userfiles);


Falls Du allerdings vorhast, nicht die Namen von Dateien zu übertragen, sondern ihre Inhalte hochzuladen, so musst Du das Übertragungsformat multipart/form-data verwenden und die Felder des Formulares entsprechend völlig anders kodieren...
When C++ is your hammer, every problem looks like your thumb.
IceRage
 2008-09-07 18:24
#114323 #114323
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
murphy+2008-09-07 16:03:38--
Falls Du allerdings vorhast, nicht die Namen von Dateien zu übertragen, sondern ihre Inhalte hochzuladen, so musst Du das Übertragungsformat multipart/form-data verwenden und die Felder des Formulares entsprechend völlig anders kodieren...


Ich kenne mich nicht so gut mit den Content-Types aus, und du hast recht. Es geht mir wirklich darum, die Dateien, und nicht die Namen zu übertragen. Wärst du wohl so nett, und zeigst mir wie das geht?

LG, IceRage
IceRage
 2008-09-08 01:18
#114330 #114330
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Also mit CPAN:HTML::Form geht das wirklich gut. Hat zwar etwas gedauert, bis ich es mir zurecht gesucht hatte, aber jetzt gehts. Hatte zwischendurch noch etwas Anderes zu tun, die Sucherei hat also nicht die ganz Zeit, die zwischen dem letzten Posting und diesem Posting hier vergangen ist, in Anspruch genommen ;-)

Ein kleines Problemchen hätte ich jetzt allerdings noch. Es gibt da sicher noch mehrere Methoden, wie das Problem zu umschiffen wäre, aber ich würde schon gern ein Array mit Dateinamen übergeben ... wie folgt:

Code (perl): (dl )
1
2
3
4
5
6
7
# So gehts nicht ...
@forms[0]->param( 'userfile[]', "$directory\\".@snapshots[$i] );
@forms[0]->param( 'userfile[]', "$directory\\".@thumbs[$i] );

# ...und so leider auch nicht ...
@values = {$directory\\".@snapshots[$i], "$directory\\".@thumbs[$i]};
@forms[0]->param( 'userfile[]', \@values);



Gibt es da evtl. noch eine Anregung?

LG, IceRage
murphy
 2008-09-07 19:57
#114332 #114332
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Im Prinzip sieht der Inhalt von multipart/form-data so ähnlich aus wie der von E-Mails mit Anhängen: Mehrere, durch eine im Anfragekopf festgelegte Zeichenkette getrennte, Blöcke, die jeweils die Daten eines Formularfeldes enthalten und ihren eigenen Kopf mitbringen.

Ich würde aber nicht unbedingt empfehlen, so etwas selbst zusammenzubasteln, sondern eher zur Verwendung eines bequemen Modules wie CPAN:HTML::Form raten.
When C++ is your hammer, every problem looks like your thumb.
Gast Gast
 2008-09-08 02:14
#114334 #114334
Was für ein Perl benutzt du??!!
Code (perl): (dl )
@forms[0]

Sollte das nicht eher
Code (perl): (dl )
$forms[0]
heißen...

übrigens:
Code (perl): (dl )
@values = {$directory\\".@snapshots[$i], "$directory\\".@thumbs[$i]};
Das kann nicht funktionieren. Eine Hashrefernz auf ein Array legen?!
benutzt du kein
Code (perl): (dl )
use warnings;
?
Code (perl): (dl )
use strict;
ist auch zu empfehlen!

Richtig ist:
Code (perl): (dl )
@values=($directory\\".$snapshots[$i], "$directory\\".$thumbs[$i]);

Oder gleich als Referenz:
Code (perl): (dl )
$values=[$directory\\".$snapshots[$i], "$directory\\".$thumbs[$i]];
Gast Gast
 2008-09-08 02:18
#114335 #114335
noch was übersehen:
Code (perl): (dl )
@values=("$directory\\".$snapshots[$i], "$directory\\".$thumbs[$i]);

Code (perl): (dl )
$values=["$directory\\".$snapshots[$i], "$directory\\".$thumbs[$i]];

Anführungszeichen überall setzen.
Du solltest wirklich "warnings" und "strict" nutzen.
IceRage
 2008-09-08 14:19
#114344 #114344
User since
2008-09-07
93 Artikel
BenutzerIn
[default_avatar]
Also ich hab jetzt, wie du empfohlen hast,
Code (perl): (dl )
1
2
use strict; 
use warnings;
eingeschaltet - kamen eine ganze Menge Meldungen, die es erstmal zu bereinigen galt - war aber kein allzu großes Problem.

Mit diesem Code hier:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        my @values=("$directory\\".$snapshots[$i], "$directory\\".$thumbs[$i]);

        $req = HTTP::Request->new("GET", "http://example/index.php");
        $req->header("content-type" => "multipart/form-data");
        $req->header("content-encoding" => "iso-8859-1");
        $cookie_jar->add_cookie_header($req);
        $res = $ua->request($req);
        my @forms = HTML::Form->parse($res);
        $forms[0]->param( 'userfile[]', \@values );
        print $forms[0]->param();
        $req = $forms[0]->click();
        $cookie_jar->add_cookie_header($req);
        $res = $ua->request($req);
        my $site = $res->content;


versuche ich 2 Bilder hochzuladen. Das Problem ist jetzt, dass ausschließlich das erste Bild im Array hochgeladen wird, wobei aber "userfile[]" auf jeden Fall das Bildarray im Formular darstellt. Da müsste man doch dann auch mehr übergeben können, oder ist das technisch gar nicht möglich?

Vielen Dank erstmal für die bisher gegebene Hilfestellung.

Gruß, IceRage
Struppi
 2008-09-08 15:13
#114350 #114350
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Hast du dir die Doku mal genauer durchgelesen?
Soweit ich dich verstehe sind die (oder representieren die) Formularfelder 'userfile[]' ja keine normalen Eingabefelder sondern einen file-input und dazu steht z.b. in der Doku:

If the input is of type file, then it has these additional methods:

$input->file

This is just an alias for the value() method. It sets the filename to read data from.
$filename = $input->filename
$input->filename( $new_filename )

This get/sets the filename reported to the server during file upload. This attribute defaults to the value reported by the file() method.
$content = $input->content
$input->content( $new_content )

This get/sets the file content provided to the server during file upload. This method can be used if you do not want the content to be read from an actual file.


Dir muss klar sein, dass die Daten eines Filefields erst noch relativ aufwendig umgewandelt werden müssen, bevor sie übertragen werden können.
murphy
 2008-09-08 19:14
#114366 #114366
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
IceRage+2008-09-08 12:19:42--
[...]
Das Problem ist jetzt, dass ausschließlich das erste Bild im Array hochgeladen wird, wobei aber "userfile[]" auf jeden Fall das Bildarray im Formular darstellt. Da müsste man doch dann auch mehr übergeben können, oder ist das technisch gar nicht möglich?
[...]


Technisch möglich ist es schon, ich bin mir aber nicht sicher, ob CPAN:HTML::Form es kann und ob das PHP-Skript am anderen Ende es auch kann.

(edit: Ein kurzer Blick auf den Quellcode von CPAN:HTML::Form bringt mich zu dem Schluss, dass es mit diesem Modul wohl wirklich nicht gehen wird.)

Im Zweifelsfall gibt's ja immer noch die Möglichkeit, einfach jedes Bild mit einer eigenen HTTP-Anfrage zu übertragen.
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2008-09-07 17:27.