Thread Fileupload mit Statusanzeige
(17 answers)
Opened by Paulaner at 2010-08-08 16:21
Hallo Zusammen,
erstmal bitte ich um Entschuldiung, dass ich zu diesem Thema noch einen Thread öffne. Bei den Einträgen alleine hier im Forum sollte man meinen, dass Thema sei bereits ausführlich besprochen. Aber ich kriegs trotzdem nicht hin ;-) Ich habe vorher noch nie etwas mit PERL gemacht (bin PHP & ABAP-Entwickler ;-)) und probiere jetzt hier schon 4 Tage an meinem Skript, aber jetzt komm ich nicht mehr weiter... Ziel: Dateiupload (bis 100 MB) mit Statusanzeige Was funktioniert bereits: der reine Dateiupload bis 100 MB Wo ist mein Problem: Meine Statusanzeige, ein per Ajax gerufenes PHP-Skript findet die Datei, welche zum selben Zeitpunkt vom Perl-Skript hochgeladen wird, nicht. (ich kann die Datei per FTP, leider ebenfalls nicht sehen) Also: Mein Perl-File speichert die Datei nicht nach jedem Schleifendurchlauf (wie gehofft), sondern erst ganz zum Schluss auf den Server. Ich habe habe schon Skripte gesehen, wo man während dem Upload zugucken konnte, wie die Datei auf dem Server (via FTP) gewachsen ist. Was mache ich falsch? Anbei mal mein Perl-Skript (Anmerkung: vor dem Upload speichere ich mir die Dateigröße in meine Datenbank um sie später beim Status berechnen wieder auslesen zu können, dass funktioniert bereits -> d.h. meine Datenbank ist bereits mit dem Wert gefüllt, bevor der Dateiupload beginnt): 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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 #!/usr/bin/perl -w # Module die benötigt werden use strict; use CGI::Carp qw(fatalsToBrowser); use CGI; use DBI; use upload_functions; # lokale Datendeklaration my $cgi; my $userid; my $uploadid; my $uploadfile; my $filesize; my $database; my $sql; my $presql; my %get_params; my $filename; my $imagename; my $filetype; my $filehandle; my $data; # Programm ---------------------------------------------------------------------------------- # Datenbankverbindung aufbauen $database = DBI->connect( "dbi:mysql:***", "***", "***" ) || die "Database connection not made: $DBI::errstr"; # Hole Parameter %get_params = parse_query_string($ENV{'QUERY_STRING'}); # 1. Schritt: Speichern der Dateigröße in Datenbank ######################################### # Hole Userid und Uploadid wenn vorhanden $userid = $get_params{'userid'}; $uploadid = $get_params{'uploadid'}; # Dateigröße ermitteln $filesize = $ENV{'CONTENT_LENGTH'}; # Dateigröße in Datenbank speichern $sql = "UPDATE Upload SET Size = ? WHERE UploadID = ? AND UserID = ?"; $presql = $database->prepare( $sql ); $presql->execute($filesize, $uploadid, $userid); $presql->finish(); # 2. Schritt: Lege benötigte Ordner an ###################################################### # Wechsel ins tempUploads-Verzeichnis chdir("../tempUploads"); # Erstelle Userverzeichnis, falls noch nicht vorhanden if(!-d $userid){ # Userverzeichnis existiert noch nicht -> Anlegen mkdir($userid, 0777); } # Wechsel ins Userverzeichnis chdir($userid); # Erstelle Verzeichnis zu Uploadid -> das darf es definitv noch nicht geben! mkdir($uploadid, 0777); # Wechsel ins Uploadidverzeichnis chdir($uploadid); # 3. Schritt: Lege Datei ins Verzeichnis #################################################### # Lade CGI-Objekt und setzte maximale Uploadgröße $cgi = new CGI; $cgi::POST_MAX = 100000000; # Hole Dateihandle $filehandle = $cgi->upload("uploadfile"); # Dateinamen erstellen $filename= $uploadid . '_org'; ($imagename,$filetype) = split(/\./, $filehandle); $filename = $filename.".".$filetype; # Datei ins Verzeichnis schreiben open UPLOADFILE, ">$filename" or die 'Fehler beim Schreiben der Datei'; # Binmode für Upload festlegen binmode $filehandle; binmode uploadfile; # Datei mittels while durchlaufen... while ( read $filehandle,$data,1024 ) { # ... und schreiben print UPLOADFILE $data; } # Datei schließen close UPLOADFILE; close($filehandle); # Zugriffsrechte setzen chmod(0777, $filename); # 4. Schritt: Verbuche den Uploaderfolg in Datenbank ######################################## $sql = "UPDATE Upload SET Uploaded = 1 WHERE UploadID = ? AND UserID = ?"; $presql = $database->prepare( $sql ); $presql->execute($uploadid, $userid); $presql->finish(); $database->disconnect(); # 5. Schritt: Weiterleitung ################################################################# my $url = "../index.php"; print "Location: $url\n\n"; exit; Also, wäre super, wenn mir jemand helfen könnte und mir den richtigen Hinweis gibt. gruß Paulaner Last edited: 2010-08-08 16:27:29 +0200 (CEST) |