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

Upload-Skript erzeugt nur leere Datei

Leser: 1


<< >> 6 Einträge, 1 Seite
MechaTikal
 2007-10-29 12:07
#101526 #101526
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
Webprogrammierung ist so gar nicht meine Sache. Trotzdem hab ich die Aufgabe, eine kleine Seite zu basteln, mit der Dateien auf einen FTP hochgeladen werden können.
Testweise habe ich (nach mehreren erfolglosen Versuchen) mit proFTPD einen FTP-Server lokal aufgesetzt, eine Seite mit Dateiauswahlmöglichkeit erstellt und versucht, eben diese zu übertragen. Aber ich scheine wohl das ganze Prinzip noch nicht recht verstanden zu haben. Es kommt zwar der Dateiname an, aber die Zieldatei bleibt leer.

Hier mal der Code (Verbindung zum FTP und Laden der Module hab ich mal weggelassen):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
my $newfilename = $q->param('filename');
my $file_given = $q->upload('uploaded_file');
starting_page();
#my $ftp = connect_to_ftp();

my $action    = $q->param('action') || "none";
print "aktion = $action datei $file_given";

if ($action eq "none") {
    #starting_page();
} elsif ($action =~ /Upload/i) {
    if ($file_given) {
        upload_file(
                #$q->upload('uploaded_file'),
                $file_given,
                $newfilename,
                );
    } else {
        print "Bitte eine Datei zum Hochladen auswählen!";
        }
}

Anzeige der Seite und Parameterabfrage.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
print $q->start_form(
                        -method=>'post',
                        -enctype=>'&CGI::MULTIPART',

                        );
    print $q->filefield(
                        -name=>'uploaded_file',
                        -size=>'30',
                        -maxlength=>'80',
        
                );
    print $q->br;
    print $q->textfield(
                        -name=>'filename',
                        -size=>50,
                        -maxlength=>80
                        );

    print $q->br;
    print $q->submit (
              -name=>'action',
              -value=>'Upload',
              -class=>'submit',
              );  

    print "</form>";
    print $q->end_form;

Die eigentliche Seite mit Dateiauswahl, Eingabe eines neuen Dateinamens und Submit-Button.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub upload_file {
my ($file, $newfilename) = @_;
print "Datei: $file neuer Name: $newfilename";
print $q->br;
while (<$file>) {

    print; #Testausgabe des Dateiinhalts
}
my $ftp = connect_to_ftp();
$ftp->put($file, $newfilename) or print "Could not upload files: $!";
$ftp->quit;
$action = "none";
}


Ist das $ftp->put jetzt hier generell falsch oder warum erhält er die komplette Datei nicht? Er zeigt mir ja den Inhalt an, aber lässt die Zieldatei immer leer...
RalphFFM
 2007-10-29 12:20
#101527 #101527
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Habe ich das richtig verstanden, daß Du die Datei per FTP zum Zielrechner übertragen möchtest, und nicht etwa per CGI/Post wie bleistiftweise in http://wiki.perl-community.de/bin/view/Wissensbasi...
beschrieben?
MechaTikal
 2007-10-29 12:24
#101529 #101529
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
RalphFFM+2007-10-29 11:20:31--
Habe ich das richtig verstanden, daß Du die Datei per FTP zum Zielrechner übertragen möchtest, und nicht etwa per CGI/Post wie bleistiftweise in http://wiki.perl-community.de/bin/view/Wissensbasi...
beschrieben?

Richtig... Hochladen mit Net::FTP geht zwar in einem anderen Skript (per Kommandozeile), aber dieses hier soll halt eine kleine Webseite werden, und da kommen nur leere Dateien an.
Ich vermute aber, dass ich CGI und NET::FTP ordentlich durcheinander gemischt habe und es viel einfacher geht.
nepos
 2007-10-29 13:56
#101530 #101530
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Geht das überhaupt? Die hochzuladende Datei liegt ja beim User auf dem Rechner, dein Code wird aber auf dem Server ausgeführt. Beim Upload via CGI wird die Datei an den Server vom Browser her mittels POST übertragen. Mit FTP kommst du ja vom Server aus nicht an die Datei, um sie dir zu holen. Oder hab ich da nun was falsch verstanden?
pq
 2007-10-29 14:07
#101531 #101531
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
vermutlich kommt nix an, weil du vorher den dateihandle ausliest.
mach nach der testausgabe mal ein seek:
Code (perl): (dl )
1
2
3
4
5
use Fcntl qw(:seek);
...
print while <$file>; # hiernach ist $file am ende angelangt
seek $file, 0, SEEK_SET; # springe wieder an den anfang
$ftp->put($file, ...);

damit faengt perl dann wieder von vorne an zu lesen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
MechaTikal
 2007-10-29 14:41
#101532 #101532
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
pq+2007-10-29 13:07:22--
vermutlich kommt nix an, weil du vorher den dateihandle ausliest.
mach nach der testausgabe mal ein seek:
Code (perl): (dl )
1
2
3
4
5
use Fcntl qw(:seek);
...
print while <$file>; # hiernach ist $file am ende angelangt
seek $file, 0, SEEK_SET; # springe wieder an den anfang
$ftp->put($file, ...);

damit faengt perl dann wieder von vorne an zu lesen.

Das ist interessant, das wusste ich noch gar nicht.
Ich muss mich aber entschuldigen, ich habe die Aufgabe missverstanden, es soll ein Upload mit CGI sein und nicht auf den FTP.
Und nach der Feststellung, dass der bsolute Zielpfad angegeben werden muss und nicht http://localhost/irgendeinordner klappt die Sache auch *uff*
<< >> 6 Einträge, 1 Seite



View all threads created 2007-10-29 12:07.