Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12512[/thread]

upload() im List Kontext geht nicht



<< >> 9 Einträge, 1 Seite
Gast Gast
 2008-09-17 21:25
#114748 #114748
Hallo,

ich möchte ein Script erstellen,das eine Datei von einem FLASH Script entgegen nimmt.
Da ich für das input field keinen Namen (bzw. der FLASh entwickler nicht weiss, welchen name flash da vergibt, egal), habe schreibe ich

my $q = CGI->new();

my @files = $q->upload();
...

Laut doku sollte dann ein Array mit filehandles zurückgegeben werden, @files ist aber leer.

Mit Angabe von
$file = $q->upload('uplname') ; # von einem testscript aus
funktioniert alles.

Was läuft falsch ?

Rolf
nepos
 2008-09-18 10:49
#114754 #114754
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Naja, die upload-Funktion von CGI kann ja auch nicht zaubern. Die erwartet als Parameter den Namen des Feldes, wo der oder die Dateinamen übergeben werden.

Du könntest dir aber mal mit Hilfe von param() die ans CGI übermittelten Felder ansehen. Da findest du sicherlich dann auch das, in dem der Dateiname steckt.
Gast Gast
 2008-09-18 12:17
#114758 #114758
nepos+2008-09-18 08:49:40--
Naja, die upload-Funktion von CGI kann ja auch nicht zaubern. Die erwartet als Parameter den Namen des Feldes, wo der oder die Dateinamen übergeben werden.

Du könntest dir aber mal mit Hilfe von param() die ans CGI übermittelten Felder ansehen. Da findest du sicherlich dann auch das, in dem der Dateiname steckt.


Doch , sollte sie können, zumindest interpretiere ich die Doku entsprechen. Dort steht:

------------------
When called with the name of an upload field, upload() returns a filehandle,
or undef if the parameter is not a valid filehandle.

.. .

In an list context, upload() will return an array of filehandles. This
makes it possible to create forms that use the same name for multiple
upload fields.
------------------
Ich hatte das zuvor mit Apache2::Upload versucht, da funktioniert es (d.h. ein Upload-Filehandle zu bekommen ohne den Namen des Uploads zu kennen), nur konnte ich da bislang die maximale Upload-Größe nicht auf 200MB erhöhen, deshalb (unter anderem) versuche ich das nun mit CGI.
Und die Doku hier habe ich daher auch so verstanden, dass upload() eine Liste aller vorhandenen upload zurück gibt, tit es aber wohl nicht.
Ich werde das jetzt alle param() durchprobieren...

rolf


Rolf
RalphFFM
 2008-09-18 12:20
#114759 #114759
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich glaube nicht, daß mit Listenkontext auch eine leere Liste gemeint ist.
Gast Gast
 2008-09-18 12:39
#114761 #114761
RalphFFM+2008-09-18 10:20:34--
Ich glaube nicht, daß mit Listenkontext auch eine leere Liste gemeint ist.


also, das Problem habe ich jetzt gelöst indem ich einfach alle param durchteste. Aber weil es mich interessiert habe ich mal in den source gesehen und demnach sollte es gehen, den upload() macht nichts anderes als :

sub upload {
my($self,$param_name) = self_or_default(@_);
my @param = grep(ref && defined(fileno($_)), $self->param($param_name));
return unless @param;
return wantarray ? @param : $param[0];
}

und $self->param(undef) liefert ja alle parameter zurück.
Und in parse() wird read_multipart() aufgerufen, das wiederum macht irgendwann:
push(@{$self->{$param}},$filehandle);

rolf



Dubu
 2008-09-20 18:33
#114815 #114815
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Quote
und $self->param(undef) liefert ja alle parameter zurück.


Es gibt einen Unterschied zwischen foo(undef) und foo().
Ersteres ist eine Parameterliste mit einem Parameter, der undef ist. Letzteres ist eine leere Parameterliste.
Linuxer
 2008-09-20 19:17
#114816 #114816
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Gast+2008-09-18 10:39:56--
und $self->param(undef) liefert ja alle parameter zurück.


Wer behauptet das?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl -l
# vi:ts=4 sw=4 et:
use strict;
use warnings;
use CGI qw( :standard );


my @list = param( undef );

print "undef: @list";


@list = ();
@list = param();

print "empty: @list";


Test:
Code: (dl )
1
2
3
$ perl /tmp/cgi.pl a=1 b=2
undef:
empty: a b
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
betterworld
 2008-09-21 15:15
#114817 #114817
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
RalphFFM+2008-09-18 10:20:34--
Ich glaube nicht, daß mit Listenkontext auch eine leere Liste gemeint ist.

Verstehe ich das richtig so, dass Du sagst, dass my @files = $q->upload(); kein Listenkontext fuer upload ist, weil @files leer ist? Das ist imho nicht richtig. Zuweisung an ein Array erzeugt immer Listenkontext.
RalphFFM
 2008-09-22 12:22
#114827 #114827
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das war so gemeint, daß ich kaum glauben konnte, daß @files = $q->upload() alle Uploadfeldnamen zurückliefert. Werktagsüber habe ich bei etlichen Dingen leider nicht die Möglichkeit zum Ausprobieren.
<< >> 9 Einträge, 1 Seite



View all threads created 2008-09-17 21:25.