Videostreams über download.php

Mainclain

Mitglied
Hallo,
ich bin gerade dabei eine kleine Videostreams seite zu erstellen.
Die soll allerdings nur im private umfang gebraucht werden, um also die videodatein vor dem Download zu sichern habe ich den Ordner mit einer .htaccess datei unzugänglich gemacht.
Der download läuft über eine download.php, die erstmal überprüft ob derjenige eingeloggt ist.

Nun dies funktioniert soweit auch, Stream geht alles ohne probleme, ausser einem:

PHP:
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);

Das ist der Teil wo die Datei zurückgegeben wird.
Also nun zum Problem:

Fange ich nun an mein Video zu laden, kann ich auf keinen Link mehr klicken, bzw. wenn ich dies tue, läd er ins unendliche, allerdings soweit ich das bisher sagen kann, nur wenn es eine PHP datei ist.

Heißt um wieder auf die Seite zu kommen, muss ich erstmal den TAB schießen, und neu auf die Seite gehen.
(Hab ich das TAB nicht geschlossen, sondern einfach ein neues gemacht und link neu eingegeben, gehts übrigends auch nicht, sobald tab geschlossen ist, ist alles in Ordnung :/)
Habt ihr da vll eine Idee?

Viele Grüße ^.^


Edit:
Als Alternative habe ich folgenen Code von php.net genommen:
PHP:
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;
  }
}

So, leider funktioniert es damit auch nicht.
Bei Firefox und IE gibt es diese Probleme, bei Opera und Safari ist alles okay. Ich vermute Opera und Safari greifen auf "Partial Content" zu :/

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

Da war noch ein kleienr fehler drin es musste $matches[1] und $matches[2] heißen, leider ist das immer noch keine Lösung




So in einem anderen Forum ist jemand darauf gekommen ^^
Die Session war noch offen, solange das Script lief. PHP konnte deswegen nicht weiter ausgeführt werden, nun gehts aber *freu*
session_write_close war die Lösung, vll hilfts ja noch jemanden
 
Zuletzt bearbeitet:
Zurück