Thread CGI von Linux zu Windows (17 answers)
Opened by Sensewell at 2009-11-12 19:28

topeg
 2009-11-13 20:13
#128179 #128179
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Hier die überarbeitete Variante.
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
#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use File::Spec;

# strict und warnings vereinfachen die Fehlersuche:
use strict;
use warnings;

my $load_win_shortcut;
my $load_win_symlink;
sub BEGIN
{
  # unter Windows symlink laden.
  # unixodie System können das direkt...
  if($^O =~/win/i)
  {
    # versuchen zu laden
    $load_win_shortcut=0;
    eval("Win32::Shortcut");
    $load_win_shortcut=1 unless($@);

    # Windows Symlinks als "fallback"
    $load_win_symlink=0;
    eval("use Win32::Symlink");
    $load_win_symlink=1 unless($@);
  }
  # Win23::Symlink überschreibt den Befehl "symlink"
  # das Modul sollte installiert sein.
}

# der basispfad in dem nach der PDF-Datei geschaut wird
# hier in Windows sowas wie "C:","ARCHIV" eintragen.
#my @path=('C:','ARCHIV');
my @pfad=('','ARCHIV');
# der Dateiname, der Gesucht wird
my $filename='asd.pdf';
# Dateiname der auf der Seite Präsentiert wird
my $webfilename='.%s.pdf';

my $cgi=CGI->new();
print $cgi->header();
warningsToBrowser(1);

my $gms_oid=$cgi->param("o");
if ($gms_oid)
{
  # name in Hexwerte wandeln und alle 2 stellen splitten.
  push(@pfad, split(/(?=(?:\d\d)+$)/,sprintf("%010X",$gms_oid)));

  # Sysmenunabhängige Pfadangabe in die Systemabhängige wandeln
  my $file=File::Spec->catfile( @pfad, $filename );
  # Existiert die Datei an dem Ort?
  if(-e $file)
  {
    # Webnahme erzeugen.
    my $webfile=sprintf($webfilename,$gms_oid);

    # symlink erzugen wenn er nicht schon existiert
    # funktioniert unter windows nur auf "ntfs"
    my $error_msg;
    unless (-e $webfile)
    {
      if(defined($load_win_shortcut) && $load_win_shortcut==1)
      {
        #Windows shortcuts
        # funktioniert auch über "NetzwerkLaufwerke"
        my $lnk = new Win32::Shortcut();
        $lnk->Path($file);
        $error_msg=$lnk->Save($webfile);
        $error_msg="Konnte $webfile.lnk nicht erstellen ($!)" unless($error_msg);
      }
      elsif(defined($load_win_symlink) && $load_win_symlink==1)
      {
        # alternativ symlink versuchen
        # eval erzeugt hier eine neue Interpereterinstanz
        # das ist nötig, da es zu einem Programmabbruch kommt,
        # wenn symlinks nicht unterstützt sind.
        $error_msg=eval{ symlink($file, $webfile) };
        if($@)
        {
          # Symlinks funktionieren generell nicht
          $error_msg="Smlinks funktionieren auf diesem System nicht!" ;
        }
        elsif(!$error_msg)
        {
          # das erstellen des Symlinks hat nicht funktioniert
          $error_msg="Konnte Symlink $webfile nicht erstellen ($!)";
        }
      }
    }

    if(-e $webfile)
    {
      # als inline-PDF ausgeben:
      print_html("<embed src='$webfile' width='100%' height='776px'>");
    }
    else
    {
      # aus irgend einem Grund konnte keine verknüpfung iregendeiner Art erstellt werden
      print_html($cgi->h1("Link Konnte nicht etzeugt werden!").$cgi->p($error_msg));
    }
  }
  else
  {
    # fehlermeldung wenn die PDF-Datei nicht gefunden wurde.
    print_html($cgi->h1("\"$gms_oid\" existiert nicht"));
  }
}
else
{
  # fehlermeldung wenn kein Parameter "o" angeben wurde.
  print_html($cgi->h1("Parameter \"o\" nicht angeben"));
}

########################################################################
# HTML-Ausgabe
sub print_html
{
  my $inline=shift;
  print $cgi->start_html(-title=>"BLUB", -bgcolor=>"#AAAAAA", -style=>{"src"=>'licis.css'}, -script=>{-language=>'JavaScript', -src=>'gms.js'});
  print $inline;
  print $cgi->end_html();
}

View full thread CGI von Linux zu Windows