steckl: fehler bei link mit onmousedown im ie

hallo,
ich habe folgenden Link:
<a id='FILE' href='./test.txt' onMouseDown="javascript:logDwonload('test.txt');">here</a>

das script sieht so aus:
function logDwonload(fileName)
{

var logUrl = 'download.pl?CALL_MODE=LOG_DOWNLOAD&FILE=' + fileName;

var logWindow = window.open(logUrl,'Help','width=100,height=100,left=0,top=0');

return(true);
}

Im Firefox funktioniert alles wunderbar, aber im IE(version6) wird zwar auch das neue Fenster aufgemacht, aber im Hauptfenster (das mit dem Link) wird nicht auf die Adresse des Links weitergeleitet. Kann mir jemand sagen, wie ich das aendern kann?

  1. Hallo,

    ich habe folgenden Link:
    <a id='FILE' href='./test.txt' onMouseDown="javascript:logDwonload('test.txt');">here</a>

    Üblicherweise nimmt man für soetwas den onclick-Event. Damit get's auch im IE. Btw.: Das javascript: im Attributinhalt für on...-Attribute ist unsinnig. Der Inhalt dieser Attribute wird ohnehin als %SCRIPT interpretiert und javascript: wäre in diesem Kontext ein label.

    <a id='FILE' href='./test.txt' onclick="logDwonload('test.txt');">here</a>

    viele Grüße

    Axel

    1. Üblicherweise nimmt man für soetwas den onclick-Event. Damit get's auch im IE.

      danke für deine Hilfe, aber das onclick bringt mir leider nix, da ich auch mit-tracen will, wenn jemand mit der rechten maustaste auf den link klickt, und dann auf speichern unter, oder auf in neuem fenster öffnen geht.
      sorry, hab vergessen dazuzuschreiben, dass es sich bei den Dateien meist um *.tar oder *.gz Dateien handeln wird (und nicht um *.txt), die eh automatisch downgeloaded werden. und ich muss mir ganz sicher sein, dass jeder download registriert wird(lieber einmal zu oft als zu wenig)

      Btw.: Das javascript: im Attributinhalt für on...-Attribute ist unsinnig. Der Inhalt dieser Attribute wird ohnehin als %SCRIPT interpretiert und javascript: wäre in diesem Kontext ein label.

      das wusste ich nicht, aber doppelt hält eh besser :P da ich relativ wenig Ahnung von javascript habe bin ich schon froh, wenn das skript überhaupt irgendwie läuft.

      mfG,
      steckl

      1. Hallo,

        danke für deine Hilfe, aber das onclick bringt mir leider nix, da ich auch mit-tracen will, wenn jemand mit der rechten maustaste auf den link klickt, und dann auf speichern unter, oder auf in neuem fenster öffnen geht.
        sorry, hab vergessen dazuzuschreiben, dass es sich bei den Dateien meist um *.tar oder *.gz Dateien handeln wird (und nicht um *.txt), die eh automatisch downgeloaded werden. und ich muss mir ganz sicher sein, dass jeder download registriert wird(lieber einmal zu oft als zu wenig)

        Hm, und mit der Tastatur - mit Tab zum Link navigieren und dann ENTER oder bei Windows:Kontextmenütaste oder [Shift]+[F10] und dann aus dem Kontextmenü Speichern unter wählen. Bei Linux ist das Aufrufen des Kontextmenüs per Tastenkombination auch einstellbar.
        Warum machst Du das Registrieren nicht serverseitig?

        "Lösung" Deines Problems:
        <a id='FILE' href='./test.txt' onmousedown="logDwonload('test.txt'); if(window.event && window.event.button==1) this.click();">here</a>

        http://de.selfhtml.org/javascript/objekte/event.htm
        http://de.selfhtml.org/javascript/objekte/event.htm#button

        Aber, wie gesagt, ich würde das Registrieren der Downloads serverseitig lösen.

        Btw.: Das javascript: im Attributinhalt für on...-Attribute ist unsinnig. Der Inhalt dieser Attribute wird ohnehin als %SCRIPT interpretiert und javascript: wäre in diesem Kontext ein label.

        das wusste ich nicht, aber doppelt hält eh besser :P

        Nein, ist nicht doppelt, ist was völlig Anderes. Ein label ist eine Markierung im Code, z.B. für die break-Anweisung.

        viele Grüße

        Axel

        1. danke alex,
          aber das bringt mich immer noch nicht wirklich weiter :(

          Hm, und mit der Tastatur - mit Tab zum Link navigieren und dann ENTER oder bei Windows:Kontextmenütaste oder [Shift]+[F10] und dann aus dem Kontextmenü Speichern unter wählen. Bei Linux ist das Aufrufen des Kontextmenüs per Tastenkombination auch einstellbar.

          daran hab ich noch gar nicht gedacht, aber das muss vielleicht nicht unbedingt sein. ich glaube es reichen die beiden maustasten. oder vielleicht irgendwas mit onfocus=...

          Warum machst Du das Registrieren nicht serverseitig?

          du meinst mit login und passwort? oder was ganz anderes?
          sowas is schon davor, damit ich mitloggen kann, welcher user welche datei downloaded. aber es wäre schlecht, wenn jeder der sich nur die seite mit dem link ansieht gleich geloggt wird. wenn dateien fehlerhaft waren muss eine mail an alle geschrieben werden, die diese bereits runtergeladen haben. und es wäre nicht gut, wenn alle die nur geschaut haben welche datein es gibt dadurch benachrichtigt würden.

          ich erklär mal kurz zum verständnis:
          der user loggt sich einmal ein. dann kann er über links die verzeichnisse eines ftp-servers durchsuchen. wenn er ne datei haben will klickt er sie an. ein perl-script lädt die datei dann lokal auf den unix-server (andere maschine als ftp). und der link der mitgeloggt werden soll zeigt dann auf diese kopie der datei.

          "Lösung" Deines Problems:
          <a id='FILE' href='./test.txt' onmousedown="logDwonload('test.txt'); if(window.event && window.event.button==1) this.click();">here</a>

          sry, wenn ich so dumm frage, aber was is wenn jemand ne text-datei mit 'ziel speicher unter' runterladen will? das sollte auf jeden fall auch gehen. soviel ich weiß kann man dem browser nicht sagen, welche dateitypen er runterlädt und welche er direkt öffnet?

          Aber, wie gesagt, ich würde das Registrieren der Downloads serverseitig lösen.

          ich weiß nicht wie das gehen würde. heißt das vor JEDEM download login und pw eingeben?

          Btw.: Das javascript: im Attributinhalt für on...-Attribute ist unsinnig. Der Inhalt dieser Attribute wird ohnehin als %SCRIPT interpretiert und javascript: wäre in diesem Kontext ein label.

          das wusste ich nicht, aber doppelt hält eh besser :P
          Nein, ist nicht doppelt, ist was völlig Anderes. Ein label ist eine Markierung im Code, z.B. für die break-Anweisung.

          du hast mich überzeugt, das 'javascript' kommt raus

          hoffe ich bin nicht zu nervig, aber ich mach das eben noch nicht so lange.

          schonmal danke,
          steckl

          1. Hallo,

            Warum machst Du das Registrieren nicht serverseitig?
            du meinst mit login und passwort? oder was ganz anderes?
            sowas is schon davor, damit ich mitloggen kann, welcher user welche datei downloaded.

            Ja, wozu brauchst Du den ganzen Rest?

            aber es wäre schlecht, wenn jeder der sich nur die seite mit dem link ansieht gleich geloggt wird.

            Wenn man sich eine Seite mit einem Link drauf ansieht, wird die Ressource hinter dem Link deswegen nicht gleich angefordert. Das passiert nur, wenn man dem Link folgt. Dann wird die Ressource per HTTP-GET angefordert. Diese Anforderungen musst Du protokollieren. Lass die Dateien einfach auch von einem Script ausliefern, welches bei Anforderung zunächst den LOG-Eintrag schreibt und dann im Response die Datei ausliefert. Die Links verweisen also nicht direkt auf die *.txp bzw. *.tar oder *.gz Datei, sondern auf ein pl-Script.

            ich erklär mal kurz zum verständnis:
            der user loggt sich einmal ein. dann kann er über links die verzeichnisse eines ftp-servers durchsuchen. wenn er ne datei haben will klickt er sie an. ein perl-script lädt die datei dann lokal auf den unix-server (andere maschine als ftp).

            Dann könntest Du diesen Vorgang doch schon vom Perl-Script protokollieren lassen.

            und der link der mitgeloggt werden soll zeigt dann auf diese kopie der datei.

            Ja und die wird dann per HTTP-GET angefordert, was wiederum vom Web-Server ohnehin protokolliert wird. Wenn die Datei nicht direkt verlinkt wird, sondern z.B. als href="download.pl?file=test.txt", dann kann download.pl alles tun, was Du willst.

            "Lösung" Deines Problems:
            <a id='FILE' href='./test.txt' onmousedown="logDwonload('test.txt'); if(window.event && window.event.button==1) this.click();">here</a>
            sry, wenn ich so dumm frage, aber was is wenn jemand ne text-datei mit 'ziel speicher unter' runterladen will? das sollte auf jeden fall auch gehen. soviel ich weiß kann man dem browser nicht sagen, welche dateitypen er runterlädt und welche er direkt öffnet?

            Was hat das mit meinem Lösungsvorschlag zu tun? Bzw. warum sollte das mit meinem Lösungsvorschlag schlechter funktionieren als ohne? Der JavaScript-Zusatz ist IE-only. Der IE hat das beschriebene Problem nicht. Der FireFox hat das beschriebene Problem. Aber das hat er auch ohne meinen Zusatz nur durch das Fensteröffnen bei onmousedown alleine. Btw.: Opera feuert bei Rechtsklick onmousedown nicht, wird also Dein nächstes Problem.

            Clientseitig wird das nichts!

            viele Grüße

            Axel

            1. morgen Axel,

              Lass die Dateien einfach auch von einem Script ausliefern, welches bei Anforderung zunächst den LOG-Eintrag schreibt und dann im Response die Datei ausliefert. Die Links verweisen also nicht direkt auf die *.txp bzw. *.tar oder *.gz Datei, sondern auf ein pl-Script.

              Ja und die wird dann per HTTP-GET angefordert, was wiederum vom Web-Server ohnehin protokolliert wird. Wenn die Datei nicht direkt verlinkt wird, sondern z.B. als href="download.pl?file=test.txt", dann kann download.pl alles tun, was Du willst.

              danke, du bist mein Held :)
              das hoert sich doch schon viel einfacher an (da ich von Perl im gegensatz zu javascript zumindest etwas Ahnung hab)
              ich werdes gleich mal ausprobieren.
              ich muss nur die Datei auslesen, und dann wieder mit irgendeinem Header (den ich noch rausfinden muss) ausgeben, oder?
              Kann ich mit nem Header auch den default-namen, unter dem die Datei gespeichert wird, angeben?

              nochmal danke,
              steckl

              1. Hallo,

                Ja und die wird dann per HTTP-GET angefordert, was wiederum vom Web-Server ohnehin protokolliert wird. Wenn die Datei nicht direkt verlinkt wird, sondern z.B. als href="download.pl?file=test.txt", dann kann download.pl alles tun, was Du willst.

                ich muss nur die Datei auslesen, und dann wieder mit irgendeinem Header (den ich noch rausfinden muss) ausgeben, oder?
                Kann ich mit nem Header auch den default-namen, unter dem die Datei gespeichert wird, angeben?

                Da kann ich nun wieder nicht viel zu sagen, weil ich wiederum Perl fast nur vom Namen her kenne. Allerdings sieht der erste Treffer bei google schon mal vielversprechend aus.

                Ich ändere mal den Threadtitel. Hier treiben sich einige Perl-Spezis rum, die Dir bei Nachfragen sicherlich weiterhelfen können.

                viele Grüße

                Axel

              2. Hell-O!

                ich muss nur die Datei auslesen, und dann wieder mit irgendeinem Header (den ich noch rausfinden muss) ausgeben, oder?

                Ja, aber nicht vergessen, in den Binärmodus zu schalten. Ein kleines Beispiel für Grafiken findest du unter Einbinden eines Perlscripts als Grafikressource, das kann man ohne weiteres um die von dir gewünschten Funktionen erweitern bzw. entsprechend abändern, wie unten gezeigt.

                Kann ich mit nem Header auch den default-namen, unter dem die Datei gespeichert wird, angeben?

                Ja, vereinfacht sieht das so aus:

                my $datei = 'download.datei';  
                my $pfad = 'pfad/zu/datei/' . $datei;  
                my $laenge = (stat("$path_file"))[7];  
                print "Content-Type:application/x-download\n";  
                print "Content-Length:$laenge;\n";  
                print "Cache-Control:private;\n";  
                print "Content-Disposition:attachment;filename=$datei\n\n";  
                open (FILE,"<$pfad");  
                binmode(FILE);  
                binmode(STDOUT);  
                while(defined(my $outfile = <FILE>)) {  
                  print "$outfile";  
                };  
                close(FILE);
                

                So sollte es funktionieren, ansonsten frag einfach nochmal nach.

                Siechfred

                --
                Hier könnte Ihre Werbung stehen.
                Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
                1. hallo,

                  vereinfacht sieht das so aus:

                  my $datei = 'download.datei';

                  my $pfad = 'pfad/zu/datei/' . $datei;
                  my $laenge = (stat("$path_file"))[7];
                  print "Content-Type:application/x-download\n";
                  print "Content-Length:$laenge;\n";
                  print "Cache-Control:private;\n";
                  print "Content-Disposition:attachment;filename=$datei\n\n";
                  open (FILE,"<$pfad");
                  binmode(FILE);
                  binmode(STDOUT);
                  while(defined(my $outfile = <FILE>)) {
                    print "$outfile";
                  };
                  close(FILE);

                    
                  ich hab inzwischen ne andere loesung fuer den header gefunden, dabei muss ich nichtmal die laenge des files bestimmen:  
                    
                  ~~~perl
                    
                      print "Content-type: application/octetstream\n";  
                      print "Content-disposition: attachment; filename=\"$fileName\"\n";  
                      print "Pragma: public\n\n";  
                    
                      open ( FILE, "$downloadDir/$fileName") || (errorOut("Couldn't open: $fileName") );  
                      while ( my $word = <FILE>) {  
                          print "$word";  
                      }  
                    
                      close FILE;  
                    
                    
                  
                  

                  funktioniert das auch immer, oder gibt es faelle in denen nur deine Loesung funktioniert?

                  Ja, aber nicht vergessen, in den Binärmodus zu schalten.

                  das sollte ich wohl noch einbauen (obwohl es komischerweise auch anders geht)

                  mfG,
                  steckl

                  1. ich hab inzwischen ne andere loesung fuer den header gefunden, dabei muss ich nichtmal die laenge des files bestimmen:

                    Die Länge ist interessant für den Downloaddialog, quasi eine Zusatzinfo für den User, damit er weiß, wieviel auf ihn zukommt.

                    print "Content-type: application/octetstream\n";

                    Verwende besser den von mir vorgeschlagenen Content-Type. Zum einen gibt es Unterschiede zwischen verschiedenen Browsern, der IE z.B. erwartet "application/octetstream", Opera "application/octet-stream". Ich weiß nicht, wie sich Opera bei einem unbekannten Typen verhält. Zum anderen kann es passieren, dass der IE bei o.g. Typ versucht, anhand der Dateiendung oder des Dateiinhaltes zu erraten, was es sein könnte. Wenn er denkt, richtig geraten zu haben, kommt kein "Speichern unter"-Dialog, sondern die Ressource wird mit dem entsprechenden Programm geöffnet.

                    Ja, aber nicht vergessen, in den Binärmodus zu schalten.
                    das sollte ich wohl noch einbauen (obwohl es komischerweise auch anders geht)

                    Das ist systemabhängig, siehe hierzu die Erläuterungen zu binmode und in perlport. Die generelle Empfehlung ist, binmode stets zu verwenden, wenn es um Downloads geht.

                    Siechfred

                    --
                    Hier könnte Ihre Werbung stehen.
                    Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
                    1. Die Länge ist interessant für den Downloaddialog, quasi eine Zusatzinfo für den User, damit er weiß, wieviel auf ihn zukommt.

                      meine letzte frage (dann bin ich komplett zufrieden:) wo wird die groesse ueberhaupt angezeigt? im downloadfenster vom IE und vom firefox bei mir nicht.

                      print "Content-type: application/octetstream\n";

                      Verwende besser den von mir vorgeschlagenen Content-Type. Zum einen gibt es Unterschiede zwischen verschiedenen Browsern, der IE z.B. erwartet "application/octetstream", Opera "application/octet-stream". Ich weiß nicht, wie sich Opera bei einem unbekannten Typen verhält. Zum anderen kann es passieren, dass der IE bei o.g. Typ versucht, anhand der Dateiendung oder des Dateiinhaltes zu erraten, was es sein könnte. Wenn er denkt, richtig geraten zu haben, kommt kein "Speichern unter"-Dialog, sondern die Ressource wird mit dem entsprechenden Programm geöffnet.

                      danke fuer den hinweis, ich habs nur im IE und im Firefox versucht und da hats 'zufaellig' funktioniert.

                      Gruss,
                      steckl

                      1. Die Länge ist interessant für den Downloaddialog, quasi eine Zusatzinfo für den User, damit er weiß, wieviel auf ihn zukommt.
                        meine letzte frage (dann bin ich komplett zufrieden:) wo wird die groesse ueberhaupt angezeigt? im downloadfenster vom IE und vom firefox bei mir nicht.

                        Im Firefox bei mir auch nicht *kopfkratz*, aber im IE zeigt er im Download-Dialog an, wie groß die angeforderte Datei ist, Opera zeigt es an, egal ob mit oder ohne "Content-Length"-Header. Sorry, dafür habe ich im Moment auch keine Erklärung parat.

                        Siechfred

                        --
                        Hier könnte Ihre Werbung stehen.
                        Viel Lärm um nichts || Steuerliche Einordnung des Rangrücktritts
                        1. meine letzte frage (dann bin ich komplett zufrieden:) wo wird die groesse ueberhaupt angezeigt? im downloadfenster vom IE und vom firefox bei mir nicht.

                          Im Firefox bei mir auch nicht *kopfkratz*, aber im IE zeigt er im Download-Dialog an, wie groß die angeforderte Datei ist, Opera zeigt es an, egal ob mit oder ohne "Content-Length"-Header. Sorry, dafür habe ich im Moment auch keine Erklärung parat.

                          is ja nicht so schlimm, hauptsache es geht jetz :)

                          nochmal danke,
                          steckl

                      2. hi,

                        hatte noch ein problem. mit deinem Skript konnte ich zwar die datei runterladen, aber in der datei stand irgendwelcher schwachsinn. hab jetz wieder meinen header verwendet und nur die aenderungsvorschlaege (x-download, binmode) eingebaut. jetzt funktioniert alles :)

                        falls es jemanden interessiert:

                          
                            my $length = (stat("$file"))[7];  
                            print "Content-Type:application/x-download\n";  
                            print "Content-Length:$length;\n";  
                            print "Content-disposition: attachment; filename=\"$fileName\"\n";  
                            print "Pragma: public\n\n";  
                          
                            open ( FILE, "$file") || (errorOut("Couldn't open: $file") );  
                          
                            binmode(FILE);  
                            binmode(STDOUT);  
                            while ( my $word = <FILE>)  
                            {  
                                print "$word";  
                            }  
                          
                            close FILE;  
                        
                        

                        danke fuer deine bemuehungen,
                        steckl