Schrift
[thread]10700[/thread]

Dateiupload: Keine leeren Dateien zulassen



<< >> 5 Einträge, 1 Seite
MechaTikal
 2007-11-01 10:05
#101630 #101630
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich bastel gerade an meiner Seite zum Hochladen mehrerer Dateien weiter. Dabei hätte ich gern die Möglichkeit, leere Dateien zu unterbinden, damit keiner auf die Idee kommt, lauter leere Dateien auf unseren Webspace zu schieben.
Eine Beschränkung für zu große Dateien hab ich drin, aber wie ich leere Dateien einfach ignorieren kann, weiss ich nicht. Gibt es da überhaupt eine Möglichkeit?

Und kann mir jemand nebenbei erklären, wie $CGI::POST_MAX arbeitet? Ich werde da nicht schlau draus...
moritz
 2007-11-01 10:49
#101633 #101633
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Spricht etwas dagegen, leere Dateien nach dem hochladen einfach sofort zu löschen?

Und was genau ist dir an $CGI::POST_MAX unklar?
pq
 2007-11-01 10:50
#101634 #101634
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
aus der doku:
Code: (dl )
1
2
3
4
5
6
7
8
        $q = CGI->new();
$q->upload_hook(\&hook,$data);

sub hook
{
my ($filename, $buffer, $bytes_read, $data) = @_;
print "Read $bytes_read bytes of $filename\n";
}

aber um einfach zu pruefen, ob eine datei leer ist, kannst du ja beim lesen des upload-filehandles
eine ueberpruefung einbauen. ich sehe da kein problem. vielleicht solltest du kurz posten,
wie du es jetzt machst, damit klar wird, wo das problem liegt.
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-11-01 11:36
#101637 #101637
User since
2007-10-10
20 Artikel
BenutzerIn
[default_avatar]
moritz+2007-11-01 09:49:00--
Spricht etwas dagegen, leere Dateien nach dem hochladen einfach sofort zu löschen?

Und was genau ist dir an $CGI::POST_MAX unklar?

Dagegen spricht in der Theorie nichts, aber man muss erst mal auf die Idee kommen. :-)
Allerdings benutze ich eine laufende Nummer, falls zwei gleichnamige Dateien hochgeladen werden, und irgendwie will das Skript die nicht runterschmeissen...

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
sub upload_file {
        my ($hashref) = @_;
        my $file;
        my $name;
        my $buffer;
        my $savefile;
        my %filehash = %$hashref;
        my $uploaddir = "/home/Michaela/public_html/uploadfiles/";
        my $success_count = 0;
        my @empty_files = ();
        my @uploaded_files = ();
        
        while (($name, $file) = each (%filehash)) {
                
                $name =~ s/\W|\s//gi; #Sonderzeichen rauswerfen
                $savefile = $uploaddir . $name;
                
                open(OUTFILE, ">$savefile.$$") or print "Error: Can't create file $savefile: $!";
                binmode $savefile;
                while(read($file, $buffer, 1024)) {
                        print OUTFILE $buffer;
                }
                close(OUTFILE);
                
                check_filesize($savefile.$$);
                
                $success_count++;
                push(@uploaded_files, $file);
        }
        if (@empty_files) {
                $message2 = "Nicht hochgeladen: @empty_files";
        }
        if ($error) {
                $message = $q->strong($error);
        } elsif (!$error) {
                $message = "$success_count Datei(en) erfolgreich hochgeladen: @uploaded_files";
        }

}
#########################################################
sub check_filesize {
        my ($file_to_check) = @_;

        my $filesize = 0;
        my @file_info;
        my $filesize;
        
        @file_info = stat($file_to_check);
        $filesize = $file_info[7];
        if ($filesize == 0) {
                chdir("/home/Michaela/public_html/uploadfiles/"); #braucht man das überhaupt?
                unlink($file_to_check) or print "Could not delete $file_to_check: $!";
        } else {
        
        }
}


Bringt aber bei mir den Fehler
"Could not delete /home/Michaela/public_html/uploadfiles/DBDOrac119targz5165: No such file or directory".

$CGI::POST_MAX habe ich jetzt verstanden: Es wird solange gesendet, bis die maximale Größe erreicht wird, dann bricht der Upload ab - richtig?
Dann müsste man doch theoretisch erkennen können, wenn keine Bytes ankommen - dann ist die Datei ja leer und der Upload könnte abbrechen. Oder ist das eine Milchmädchenrechnung?
moritz
 2007-11-01 16:32
#101660 #101660
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Die Idee hinter POST_MAX ist, dass man sich den eigenen Server nicht lahmlegen lassen will, indem jemand Gigabyteweise Dateien hochlädt. Kleine Uploads sind im Allgemeinen eher nicht schädlich, wenn kleine Dateien hochgeladen werden, also ist in CGI keine Möglichkeit vorgesehen, das auf triviale Art zu verhindern.

Du veränderst in deiner ersten Funktion den Dateinamen, und versuchst dann, die Datei mit den veränderten Dateinamen zu löschen - das ist keine gute Idee.

Außerdem weiss ich nicht, was in %filehash ist - zumindest benutzt du die Funktion upload_file nicht so, wie der upload_hook in CGI.
<< >> 5 Einträge, 1 Seite



View all threads created 2007-11-01 10:05.