Videostreams über download.php

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Videostreams über download.php

    Hallo,
    habe bisher nichts dazu gefunden und hänge da schon seit Tagen dran fest :/
    Also mein Problem:
    Ich habe eine Internetseite auf der ich einige Videos laufen lasse. Damit unbefugte sie nicht einfach downloaden können, lass ich den download über eine download.php laufen.
    Diese überprüft ob derjenige eingeloggt ist und gibt dann die Datei raus.

    So der Videostream ansich geht auch, es wird alles korrekt angezeigt Sound ist auch da, das Problem ist: Die Internet-Seite hängt danach.
    Wenn ich also mein Video starte (und dieses somit läd) kann ich auf keine andere Seite mehr gehen. (unendlich laden)

    Leider hat alles was ich bisher versucht habe nichts geholfen

    PHP-Code:
    header("HTTP/1.1 200 OK");
        
    header('Last-Modified: ' date('r'$stat['mtime']));
        
    header("Etag: \"".$etag."\"");
        
    header("Content-Disposition: attachment; filename=\"".$filename[1]."\"");
        
    header("Accept-Ranges: bytes");
        
    header("Connection: Keep-Alive");
        
    header("Keep-Alive: timeout=5, max=83");
        
    header("Content-Type: ".mime_content_type($file));

        
    readfile($file); 
    Dann hatte ich noch von php.net

    PHP-Code:
    function smartReadFile($location$filename$mimeType='application/octet-stream')
    {
        if(!
    file_exists($location))
        {
            
    header ("HTTP/1.0 404 Not Found");
            return;
        }

      
    $size=filesize($location);
      
    $time=date('r',filemtime($location));

      
    $fm=@fopen($location,'rb');
      if(!
    $fm)
      {
          
    header ("HTTP/1.0 505 Internal server error");
          return;
      }

      
    $begin=0;
      
    $end=$size;

      if(isset(
    $_SERVER['HTTP_RANGE']))
      {
          if(
    preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i'$_SERVER['HTTP_RANGE'], $matches))
          {
              
    $begin=intval($matches[0]);
              if(!empty(
    $matches[1]))
                
    $end=intval($matches[1]);
          }
      }

      if(
    $begin>0||$end<$size)
        
    header('HTTP/1.0 206 Partial Content');
      else
        
    header('HTTP/1.0 200 OK');

      
    header("Content-Type: $mimeType");
      
    header('Cache-Control: public, must-revalidate, max-age=0');
      
    header('Pragma: no-cache');
      
    header('Accept-Ranges: bytes');
      
    header('Content-Length:'.($end-$begin));
      
    header("Content-Range: bytes $begin-$end/$size");
      
    header("Content-Disposition: inline; filename=$filename");
      
    header("Content-Transfer-Encoding: binary\n");
      
    header("Last-Modified: $time");
      
    header('Connection: close');

      
    $cur=$begin;
      
    fseek($fm,$begin,0);

      while(!
    feof($fm)&&$cur<$end&&(connection_status()==0))
      { print 
    fread($fm,min(1024*16,$end-$cur));
        
    $cur+=1024*16;
      }

    Diese Code gefunden. Das Problem hier: Opera und Safari scheinen das HTTP/1.0 206 Partial Content zu benutzen, also eine HTTP_RANGE zu schicken, Firefox und IE leider nicht (Zumindest so wies mir vorkommt).
    Mit diesem Code geht das verlinken zumindest bei Opera und Safari.

    Weiß langsam nicht mehr weiter, googeln und Boardsuche haben mich leider auch nicht viel weiter gebracht.

    Hoffe ihr habt da eine Idee.

  • #2
    Hallo,

    das Problem bei deinem Code ist, dass du dem Browser mitteilst, er könne den Download portionieren, also auch später wiederaufnehmen (Accept-Ranges-Header). Wenn er sich darauf verlässt, was er ja durchaus darf, schiebst du ihm aber wieder die komplette Datei unter und das dann eben mehrmals.

    Entweder du setzt diesen Header auf "none" (partial content nicht unterstützt) und lässt ihn einmal die komplette Datei saugen oder du nimmst den unteren Code (empfohlen!) und unterstützt damit partial content korrekt. Ob das der Browser dann in Anspruch nimmt, musst du ihm überlassen.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Okay, wie schon geschrieben, auch beim Unterem Code gibts Probleme mit Firefox und Internetexplorer.
      Müsste ich daran noch etwas ändern?

      Bzw. sollte ich beim Unteren Code
      PHP-Code:
      header('Accept-Ranges: bytes');
        
      header('Content-Length:'.($end-$begin));
        
      header("Content-Range: bytes $begin-$end/$size"); 
      Nur mit reinnehmen wenn auch partial content angefragt, also HTTP_RANGE gesetzt ist?



      Kommentar


      • #4
        Der Code an sich sieht richtig aus, getestet habe ich ihn aber nicht. Auch rausnehmen musst du diese Header für komplette Abfragen nicht. Kannst du die Ursache für die Probleme im Firefox vielleicht noch näher erläutern? Vielleicht auch mal mit deinem Code für den Aufruf der smartReadFile-Funktion?
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Hmm, erläutern... schwierig xD
          Also ich gehe auf meine seite, und fange an das Video zu laden. (Wirklich erst nach dem ich aufs Video geklickt hab) Danach versuche ich auf einen weiteren Link zu gehen beispielsweise
          von index.php zu list.php und dann läd er ins unendliche, also ladebalken bei Firefox kommt unten, aber es tut sich nichts sondern bleibt immer leer.

          Ein kleiner Fehler im Code ist mir noch aufgefallen
          PHP-Code:
          if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i'$_SERVER['HTTP_RANGE'], $matches))
                {
                    
          $begin=intval($matches[0]);
                    if(!empty(
          $matches[1]))
                      
          $end=intval($matches[1]);
                } 
          Da müsste matches[1] begin und matches[2] ende sein oder?
          Index 0 steht ja eigentlich immer für den gesamten Ausdruck.
          Mal sehn ob sich dadurch was verändert.
          Edit: Okay ändert sich nichts :/

          Der aufruf an sich:
          PHP-Code:
          smartReadFile($filepathbasename($filepath), mime_content_type($filepath)); 
          Zuletzt geändert von mainclain; 08.11.2010, 10:11.

          Kommentar


          • #6
            Ja, du hast recht in Bezug auf die Indizes des $matches-Arrays. Du testest ja bestimmt auf einem lokalen Webserver. Lässt der eventuell nur eine Verbindung gleichzeitig zu? Schau mal in der httpd.conf nach ThreadsPerChild und MaxRequestsPerChild.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              ThreadsPerChild:250
              MaxRequestsPerChild:0

              Was genau bedeutet eine Verbindung? Ich kann ja auch gleichzeitig mit 2 Browsern drauf - Als IE lad ich beispielsweise das Video, FF spring ich auf der seite umher

              Kommentar


              • #8
                Mh, dann fällt mir erstmal auch nichts mehr ein, außer dass vielleicht ein Firefox-Add-On da irgendwie dazwischen funkt. Du kannst ja alle mal temporär deaktivieren oder den Firefox über den Safe-Mode-Link starten.

                Edit: Achso, außerdem kannst du versuchen, mal Connection: close zu senden, statt keep-alive und den Keep-Alive-Header ganz rausnehmen.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  worker - Apache HTTP Server
                  mpm_common - Apache HTTP Server

                  Kommentar


                  • #10
                    Die Links hatte ich mir auch schon rausgesucht, trotzdem danke dafür ^.^

                    Wegen dem Connection: Close - Wird doch bei der 2. Funktion standartmäßig gesendet.
                    PHP-Code:
                    header('Connection: close'); 
                    Auch Addons ausstellen hat leider nicht geklappt :/ (Bei IE hab ich ja sowieso keine xD)

                    Mit dem Firefox addon Live HTTP headers wird folgendes als Response gegeben:

                    Code:
                    HTTP/1.0 200 OK
                    Date: Mon, 08 Nov 2010 10:19:02 GMT
                    Server: Apache/2.2.8 (Ubuntu) PHP/5.3.3-0.dotdeb.1 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g
                    X-Powered-By: PHP/5.3.3-0.dotdeb.1
                    Expires: Thu, 19 Nov 1981 08:52:00 GMT
                    Cache-Control: public, must-revalidate, max-age=0
                    Pragma: no-cache
                    Accept-Ranges: bytes
                    Content-Length: 778637051
                    Content-Range: bytes 0-778637051/778637051
                    Content-Disposition: inline; filename=video.flv
                    Content-Transfer-Encoding: binary
                    Last-Modified: Wed, 03 Nov 2010 23:46:46 +0100
                    Connection: close
                    Content-Type: video/x-flv
                    Zuletzt geändert von mainclain; 08.11.2010, 11:27.

                    Kommentar


                    • #11
                      Noch kurz eine Sache: Wenn ich statt auf eine php seite nach dem Laden des Videos auf eine HTML seite gehe, scheint alles ordnunggemäß zu funktionieren :/

                      Kann es an den PHP-Einstellungen liegen? Das das PHP script erst ausgeführt wird wenn das andere (download.php) beendet wurde? (Nur komisch das es parallel mit mehreren Browsern klappt)


                      Achja am Player liegts sicher auch nicht xD Hab flowplayer und JWPlayer ausprobiert, beide gingen nicht.
                      Zuletzt geändert von mainclain; 08.11.2010, 14:35.

                      Kommentar


                      • #12
                        Zitat von mainclain Beitrag anzeigen
                        Damit unbefugte sie nicht einfach downloaden können, lass ich den download über eine download.php laufen.
                        Diese überprüft ob derjenige eingeloggt ist
                        Und das machst du wie genau - über Sessions vielleicht?

                        Falls ja, dann ist der Fall klar - die geöffnete Session-Datei ist gelockt, andere Scripte, die ebenfalls die Session nutzen, können nicht darauf zugreifen, so lange das andere Script noch läuft.

                        Lösung: Nach dem Prüfen der Zugriffsberechtigung, vor dem Ausliefern der Video-Daten, session_write_close aufrufen.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Werde ich mal probieren, danke ^.^
                          Allerdings gibts den Fehler auch wenn ich einfach auf eine Seite linke wie:
                          test.php
                          -> <?php echo "test"; ?>
                          bei einer
                          test.html
                          ist der Fehler aber nicht, kanns trotzdem dran liegen?
                          Das mit Session closen werd ich trotzdem mal versuchen, danke ^.^



                          Edit: Haha danke, genau das war die Lösung.
                          Naa super, vielen viel dank, hab gar nicht dran gedacht, das die Sessions das Problem sein könnte ^.^
                          Auch an alle anderen, vielen Dank für eure bemühungen
                          Zuletzt geändert von mainclain; 08.11.2010, 15:12.

                          Kommentar


                          • #14
                            Nun hab ich doch noch ein Problem.
                            Ich hab mein Video als mp4 gespeichert, leider kann ich dieses nicht abspielen.
                            Nun dachte ich liegts an meinen player, hab nun mit mein iphone getestet und einen einfachen Link eingebaut.
                            Direkter Link zum Video: anzeige klappt; über die download.php gehts nicht - er sagt Video kann nicht angezeigt werden.
                            Jemand eine Ahnung woran es liegen könnte?

                            Beim PC kann ich über den download link das ganze Aufrufen, über den Player aber auch nicht :/


                            Ich habs bis jetzt leider nicht hinbekommen
                            Nun hab ich allerdings eine Möglichkeit gefunden die nicht ganz so gut ist.
                            Da das Problem nur bei Iphone auftrat, habe ich eine extra funktion für iphone erstellt.
                            Hierbei wird jedes mal aufruf meiner Seite die IP überprüft und in eine .htaccess datei geschrieben, wenn noch nicht vorhanden. (Nur bei IPHONE, bzw. Mobile Versionen)
                            So hat der iphone nutzer vollen zugriff auf den Files ordner.
                            Das ganze ergänze ich nun noch mit einer Datenbank verbindung, inder ich die Zeiten schreibe und lösche nach einer bestimmten zeit die ip wieder aus der htaccess hinaus.
                            Zuletzt geändert von mainclain; 12.11.2010, 22:42.

                            Kommentar

                            Lädt...
                            X