Schrift
[thread]12575[/thread]

CGI::Application::Plugin::Stream und HTML::Template::Compiled



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
MartinR
 2008-10-02 14:12
#115101 #115101
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich versuche innerhalb einer CPAN:CGI::Application - Anwendung mittels CPAN:CGI::Application::Plugin::Stream eine Ausgabe aus CPAN:HTML::Template::Compiled auszugeben.

Da ich aber die Ausgabe aus HTC nicht als Datei speichern will um dann diese an CGI-App-Stream zu übergeben müsste es doch auch mit einem Filehandle gehen. Nur leider habe ich mit fh noch keinerlei Erfahrungen ...

Kurz zur Erklärung: Ich habe einen Online-Terminkalender programmiert und der User soll nun per Klick auf einen Termin die Daten dieses Termines als iCalendar-File zum Download für Outlook angeboten bekommen.
pq
 2008-10-02 15:02
#115103 #115103
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich kenne CGI::Application::Plugin::Stream nicht - deshalb meine frage: was meinst du mit
"Nur leider habe ich mit fh noch keinerlei Erfahrungen"?
wo soll ein fh sein?
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
MartinR
 2008-10-02 15:18
#115104 #115104
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Nun es gibt zwei Möglichkeiten mit CGI::Application::Plugin::Stream Dateien auszugeben.

http://search.cpan.org/~purdy/CGI-Application-Plug...

... This method can take two parameters, the first the path to the file or a filehandle and the second, an optional number of bytes to determine the chunk size of the stream ...

Also einmal eine tatsächlich existierende Datei übergeben oder zum Anderen ein Filehandle.

Ich könnte nun schon
- Datei über HTC erzeugen und auf Platte speichern
- mit Stream ausgeben
- und dann wieder löschen
( das funktioniert auch )

Da ich die "Datei" aber eigentlich nicht brauche müsste es doch auch gehen sie direkt aus HTC irgendwie an CGI-App zu "übergeben".

Wie gesagt - mit Filehandles habe ich bisher noch überhaupt keine Erfahrung. Vielleicht stelle ich mir das ja auch komplett falsch vor ...
pq
 2008-10-02 15:38
#115106 #115106
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also wenn ich das richtig verstehe, muss HTC in ein filehandle schreiben (ist in der doku
beschrieben) und stream_file() aus einem filehandle lesen.
hier mal ein proof of conecpt:
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
use HTML::Template::Compiled;
sub stream {
    my ($fh) = @_;
    while (<$fh>) {
        print "STREAM: $_";
        sleep 1;
    }
}

if (my $pid = open my $pipe, "-|") {
    # prozess forken, kind schreibt in $pipe als STDOUT,
    # wir lesen von $pipe
    stream($pipe);
}
else {
    my $htc = HTML::Template::Compiled->new(
        scalarref => \<<EOM,
test
1
zwo
blubb
EOM
        out_fh => 1,
    );
    $htc->output(\*STDOUT); # schreibt in $pipe
    exit;
}


edit: hatte das exit vergessen
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
pq
 2008-10-14 17:52
#115510 #115510
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
@MartinR: das würde mich jetzt doch mal interessieren, ob das geholfen hat. du warst ja
in der zwischenzeit online, aber hast hier nix zu geschrieben.
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
Gast Gast
 2008-10-14 20:30
#115525 #115525
... hab die Lösung ehrlich gesagt noch nicht probiert, da ich noch nicht so genau durchblicke wie ich das in meine App einbauen soll. Momentan läuft es noch wie anfänglich beschrieben ...

- Datei anlegen
- Datei ausgeben
- Datei wieder löschen

Morgen dann mehr ...
MartinR
 2008-10-15 09:04
#115533 #115533
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
... also momentan ist es wie folgt gelöst:

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
# Seminartermin für Outlook-Kalender ausgeben
sub SendeOutlookTermin {
        my $self = shift;

        $self->{ICALENDAR_TMPL} = HTML::Template::Compiled->new (
                filename => 'htc_icalendar.ics',
                path     => '/usr/local/httpd/htdocs/cgi-bin/seminare_v2/tmpl/',
                );

        $self->ICalendar::HoleIcalTerminDaten();

        $self->{DOWNLOAD} = 'files/'.$self->session->id().'.ics';

        open (ICAL, ">$self->{DOWNLOAD}") || die 'Fehler bei open \n';
                print ICAL $self->{ICALENDAR_TMPL}->output();
        close(ICAL) || die 'Fehler bei close \n';

        $self->{DateiDownloadTyp} = 'ics';

}


# Seminartermin für Outlook-Kalender aus DB auslesen
sub HoleIcalTerminDaten {
        my $self = shift;

        $self->SqlStatements::HoleIcalTerminDatenSQL() unless defined $self->{HoleIcalTerminDatenSQL};
        $self->{HoleIcalTerminDatenSQL}->execute( $self->{TerminID} );

        my ( $seminar_nr, $seminar_titel, $start_datum, $start_uhrzeit, $ende_datum, $ende_uhrzeit, $start_datum_ical, $start_uhrzeit_ical, $ende_datum_ical, $ende_uhrzeit_ical );
        $self->{HoleIcalTerminDatenSQL}->bind_columns(undef, \( $seminar_nr, $seminar_titel, $start_datum, $start_uhrzeit, $ende_datum, $ende_uhrzeit, $start_datum_ical, $start_uhrzeit_ical, $ende_datum_ical, $ende_uhrzeit_ical ));
        $self->{HoleIcalTerminDatenSQL}->fetch();

        $self->{ICALENDAR_TMPL}->param(
                CGISESSID => $self->session->id(),
                SEMINAR_NR => "$seminar_nr",
                SEMINAR_TITEL => "$seminar_titel",
                SEMINAR_VON => "$start_datum $start_uhrzeit",
                SEMINAR_BIS => "$ende_datum $ende_uhrzeit",
                SEMINAR_VON_DATETIME => "$start_datum_ical"."T$start_uhrzeit_ical",
                SEMINAR_BIS_DATETIME => "$ende_datum_ical"."T$ende_uhrzeit_ical",
                JETZT_DATETIME => "20081006T080000",
                );
}


Und in meinem Application-File steht dann u.a. folgendes

Code (perl): (dl )
1
2
3
4
5
...
use CGI::Application::Plugin::Stream (qw/stream_file/);
...
$self->stream_file($self->{DOWNLOAD}, 2048) || die 'Fehler bei stream_file \n';
$self->header_add( -attachment => "kalender.ics" );


Wie gesagt - ich hab jetzt keinen Plan wie ich Deine Codeschnipsel einbinden könnte bzw. sollte ...
Gast Gast
 2008-10-15 09:31
#115534 #115534
Versuch es doch mal so:
Code (perl): (dl )
1
2
3
4
5
use IO::String;

#...

$self->{DOWNLOAD} =IO::String->new($self->{ICALENDAR_TMPL}->output());


Das erzeugt ein virtuelles Filehandle, und wenn ich "CGI::Application::Plugin::Stream" richtig verstehe, kann es damit umgehen...
MartinR
 2008-10-15 10:07
#115535 #115535
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
... da spuckt er mir leider folgendes aus:
Code: (dl )
1
2
3
4
stat() on unopened filehandle GEN0 at /usr/lib/perl5/site_perl/5.8.6/CGI/Application/Plugin/Stream.pm line 21., referer: https://xxx/seminare_v2/kalender
Failed to load File::MMagic module to determine mime type: Can't locate object method "BINMODE" via package "FileHandle" at /usr/lib/perl5/site_perl/5.8.6/File/MMagic.pm line 576., referer: https://xxx/seminare_v2/kalender
Error executing class callback in postrun stage: Can't locate object method "SEEK" via package "FileHandle" at /usr/lib/perl5/site_perl/5.8.6/CGI/Application/Plugin/Stream.pm line 84., referer: https://xxx/seminare_v2/kalender
malformed header from script. Bad header=Content-length: seminare.pl, referer: https://xxx/seminare_v2/kalender
Struppi
 2008-10-15 11:42
#115537 #115537
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
kann es sein, dass du File::MMagic nicht installiert hast?
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2008-10-02 14:12.