Schrift
[thread]12464[/thread]

Ein bisschen AJAX mit Perl

Leser: 3


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
cbxk1xg
 2008-09-09 20:27
#114436 #114436
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich habe ein kleines Upload-Script und möchte dem User wärend des Uploads einen Status-Bar anzeigen. Den Javascript-Teil selbst bekomme ich hin. Das ist nicht so schlimm.

Meine Idee war nun, ich erzeuge eine Session-ID, benenne die Datei des User in die Session-ID um und frage alle x Sekunden ab, wie groß die Datei auf dem Server ist. Also: User wählt im HTML-Formular eine Datei aus (meinvideo.mpg), ich mache daraus (4092859932717.mpg) und schaue mir dann die Dateigröße an.

Nun kommt jedoch das große ABER... Die Datei erscheint nicht im gewünschten Verzeichnis, ist also gar nicht vorhanden, bis der Upload komplett ist. - Aber Warum???

Die Datei schreibe ich wie folgt auf den (Linux-)Server:
Code (perl): (dl )
1
2
3
4
5
6
7
8
use CGI qw/:standard/;
$CGI::POST_MAX=1024 * $MaxSize;
my $serverFile = $UploadDir . (split(/[\\\/]/, param('UserVideo')))[-1];

my $buffer;
open (FILE,">$serverFile");
while (my $bytesread=read($filename,$buffer,1024)) {print FILE $buffer;}
close (FILE);


Wo liegt mein Denkfehler?
moritz
 2008-09-09 21:51
#114442 #114442
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Vielleicht wird die Datei gecached? $| beachten. Siehe perlvar.

Ausserdem solltest du nach einem open immer überprüfen, ob es geklappt hat.
cbxk1xg
 2008-09-09 22:05
#114443 #114443
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Ich verstehe den Hinweis mit $| nicht.

moritz+2008-09-09 19:51:29--
Ausserdem solltest du nach einem open immer überprüfen, ob es geklappt hat.
Ja, weiss ich. Ist aber hier nicht wirklich entscheidend.
GwenDragon
 2008-09-09 22:16
#114444 #114444
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
Schon use strict; und use warnings; verwendet?

Schon geschaut, was in $serverFile drin steht?
Wo kommt $filename her?

Verwende bitte keine solchen Dateihandles.
Anstatt FILE ist es sinnvoller $file zu schreiben. Am Besten, du erzeugst gleich ein eigenes mit CPAN:FileHandle.
cbxk1xg
 2008-09-09 22:30
#114446 #114446
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Danke, liebe Drachin. Der Upload geht. use strict, use warnings, Taint-mode, Server Logfiles. Alles sauber und schön.

ABER: Die Datei erscheint nicht im gewünschten Verzeichnis, ist also gar nicht vorhanden, bis der Upload komplett ist.
jan
 2008-09-09 22:39
#114447 #114447
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn ich das richtig erinnere, parst CGI.pm erstmal den kompletten kram, der übergeben wird - und erst dann geht's weiter mit deinem script. das müsstest Du wohl anders machen, vielleicht mit eigenem code die daten in eine temporäre datei schreiben und anschließend erst das CGI-object erstellen, das kann ja auch von einem filehandle lesen...
pq
 2008-09-09 22:54
#114448 #114448
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
perldoc CGI, suche nach hook
$q = CGI->new(\&hook);
das verwende ich dafür erfolgreich.
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
GwenDragon
 2008-09-09 23:18
#114449 #114449
User since
2005-01-17
14761 Artikel
Admin1
[Homepage]
user image
cbxk1xg
 2008-09-09 23:29
#114450 #114450
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Danke GwenDragon. Das Modul scheidet leider aus. Ist ein normaler Webspace.

Soweit ich das jetzt verstanden habe, schreibt das Script erst nachdem der Upload fertig ist die Datei auf den Server. Mein Script macht also wärend dessen gar nichts. Das CGI-Modul cached die Datei also. Mist!

Das Beispiel mit...
Code (perl): (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";         
 }


...verstehe ich ehrlich gesagt nicht. Was genau ist der Unterschied zu meiner Lösung (die ja nicht funktioniert) und wie könnte man das in meinen Code einbauen?
RalphFFM
 2008-09-09 23:43
#114451 #114451
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
cbxk1xg+2008-09-09 18:27:06--
[...]
while (my $bytesread=read($filename,$buffer,1024)) {print FILE $buffer;}
[...]

Habe ich das richtig verstanden, daß man $bytesread nicht für diesen Zweck verwenden kann? :-(
Also a la while ($bytesread += read($filename,$buffer,1024)) {print FILE $buffer;}
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2008-09-09 20:27.