Thread Fileupload mit Statusanzeige (17 answers)
Opened by Paulaner at 2010-08-08 16:21

Paulaner
 2010-08-08 16:21
#140470 #140470
User since
2010-08-08
9 Artikel
BenutzerIn
[default_avatar]
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)

View full thread Fileupload mit Statusanzeige