Thread erstellte Datei nach Download löschen (33 answers)
Opened by sirius at 2012-10-25 10:48

sirius
 2012-10-25 13:48
#162827 #162827
User since
2012-01-06
25 Artikel
BenutzerIn
[default_avatar]
Danke für die Anregungen.

Auf die Idee den Rückgabewert von print $bytes zu prüfen bin ich nicht gekommen, der funktioniert sehr schön.

Ich habe allerdings gleich mal alle Vorschläge getestet (will ja auch lernen). Der Code sah dann so aus:
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
#!/usr/bin/perl

use strict;

$SIG{PIPE}=\&remove; # test PIPE signal


open(my $file, ">backup.txt");
for (my $i=1;$i<10000000;$i++) {
        print $file "Hello World\r\n";
}
close($file);

my $filedestruct=new SQLDump('backup.txt'); # test destruction object

print qq(Content-Type: text/plain\n);
print qq(Content-Disposition: attachment; filename="backup.txt"\n\n);
open(my $file, "<backup.txt");
binmode($file);
eval { # test eval
        while (read($file,my $bytes,1024)) {
                print $bytes or die 'STDOUT closed'; 
        }
        1;
} or do {
        &remove("eval $@");
};

close($file);
&remove('normal');  # simple remove file before normal end of script  

# --------------------------

sub remove {
        &log;
        my $filename='backup.txt';
        if (-e $filename) {unlink($filename);}
}

sub log {
        open(my $file, ">>log.txt");
        print $file time.": @_\n";
        close($file);
}

# ==============================
package SQLDump;

sub new {
        my $self={filename=>$_[1]};
        bless $self;
        return $self;
}
sub DESTROY {
        my $self=shift;
        my $filename=$$self{filename};
        &main::remove('destroy');
        
}

Wir Ihr seht, steht in der log.txt dann drin, was passiert ist.
Wenn man den Download vorzeitig abbricht steht da (auch in dieser Reihenfolge):
Code: (dl )
1
2
1351164942: PIPE
1351164942: eval STDOUT closed at ... line 22.

Wenn der Download durchläuft:
Code: (dl )
1
2
1351165285: normal
1351165285: destroy


Die SIG{INT} Variante kommt nie.
Das mit dem Destructor funktioniert leider auch nicht.

Ein interessanter Aspekt ist noch, wenn ich den eval-Block nicht selbst mit "die" verlasse, dann bekomme ich in der log.txt ganz viele PIPE-Signals auf einmal, und sonst nichts.

Falls noch jemand weitere Anregungen hat, dann sind diese herzlich wollkommen. Ansonsten werde ich jetzt einen eval-Block drumrumbasteln. Man da hätte ich auch selber drauf kommen können.

View full thread erstellte Datei nach Download löschen