Probleme beim Download großer Dateien mit PHP

magman

Mitglied
Hallo zusammen,

folgende Situation:

ich übergebe aus FlashMX folgende Variable:

Code:
on (release) {
getURL("download.php?file=1");
}


und spreche damit folgendes PHP Skript an:

Code:
<?php

      $Datei = array();
      $Datei[1] = "test.zip";
      $Datei[2] = "test.mov";
      $Datei[3] = "test2.mov";
      
      $ERR = "ERROR: the content is not available";

      extract($_GET);
      $Verzeichnis = "./downloads/";
      $Down_Name = $Datei[$file];
      $Down_File = $Verzeichnis.$Datei[$file];

      if(!file_exists($Verzeichnis.$Down_Name)||!$Down_Name)
        {
        echo "
        <script type='text/javascript' language='JavaScript'>
        <!--
         alert('$ERR');
        //-->
        </script>
        ";
        exit;
        }
      $size = filesize($Down_File);
      clearstatcache();
      $Countverz = $Verzeichnis."counter";
      $GS = 0;
      if(!is_dir($Countverz)) mkdir("$Countverz",0777);

      $DownStat = "$Countverz/DownStat.txt";
      if(!file_exists($DownStat))
        {
        $fp = fopen($DownStat,"a");
        fputs($fp,"Gesamt:0\n");
        fclose($fp);
        }
      $DownStatfile = file($DownStat);
      $found = 0;
      for($i=0;$i<count($DownStatfile);$i++)
        {
        list($D,$C) = split(":",chop($DownStatfile[$i]));

        if($D == "Gesamt") continue;
        if($D == $Datei[$file])
          {
          $C++;
          $found = 1;
          }
        $SP = "$D:$C\n";
        $GS = $GS + $C;
        }
      if(!$found) $SP .= $Datei[$file].":1\n";
      $SP .= "Gesamt:$GS\n";
      $fp = fopen($DownStat,"w");
      flock($fp,2);
      fputs($fp,$SP);
      flock($fp,3);
      fclose($fp);


      header("Content-type: application/octet-stream");
      header("Content-disposition: attachment; filename=".$Down_Name);
      header("Content-Length: $size");
      header("Pragma: no-cache");
      header("Expires: 0");
      readfile($Down_File);

      close();


Das Problem ist folgendes:

Der Download mit Dateien um die 5 mb funktioniert gut, bei Dateien um die 50 mb (und diese Größenordnung möchte ich zum Download anbieten) funktioniert nicht.
Die Daten werden einfach nicht vollständig heruntergeladen.
Es handelt sich um *.mov files.

Da ich nicht unbedingt die PHP Leuchte bin, wäre ich euch dankbar wenn mir jemand bei der Problemlösung behilflich sein könnte.

Vielen Dank schon mal im Vorraus,

Grüße, Magma.
 
Versuch es mal ohne die Übermittlung von Content-Length.

PHP:
    header('Content-Type: application/octetstream', true);
    header('Content-Disposition: attachment; filename="'.LOAD_DIRECTORY . $_GET['file'].'"');
    readfile(LOAD_DIRECTORY . $_GET['file']);
    exit;
}

So sieht es bei mir aus und es funktioniert mit Dateien bis 1GB... (größere habe ich leider nicht zum testen da.
 
Hi @magman!

Da dein Script mit kleineren Dateien funktioniert und dein Script mehr im PHP arbeitet als das von @Felix Jabobi, so vermute ich, dass dein Downloadscript ein Opfer von dem Zeitlimit gewurden ist.

versuch mal an den Punkt, wo der Download gestartet wird ein set_time_limit(0); zu setzten, somit wird der Zeitlimit auf unentlich gesetzt.

Hier kannst du dich nochmal bissel dazu belesen.

http://www.php.net/manual/de/function.set-time-limit.php

Gruß Matze202.
 
Hmm, wieso arbeitet sein Script mehr mit PHP?

Wahrscheinlich weil ich nur den Downloadpart geschrieben habe und nicht die Aktualisierung von Traffic, Counter und all solchen Kleinigkeiten.

Meiner Meinung nach war das eher uninteressant.
 
Es war halt von mir ne Idee, falls das set_time_limit bei dir irgendwo anders bereits auf 0 gesetzt ist und bei ihm vielleicht nicht.

Gruß Matze202.
 
Nein, ist es definitiv nicht.

Und das PHP Script ist beendet sobald der Download beginnt, sprich ich kann den Browser schließen und sehe auch lokal, dass das Script nicht mehr arbeitet.
 
Hi Matze, Hi Felix,

Danke für eure Antworten.

@Matze

set_time_limit(0); funktioniert bei mir nicht, da mein Strato Server im Safe Mode läuft, ich also scheinbar keine grundlegenden Änderungen an der php.ini vornehmen kann.

@Felix

könnetest Du evtl. deinen kompletten PHP Loader Code posten, damit ich den mal austesten kann?

Noch jemand eine Idee oder ein empfehlenswertes Skript für nen PHP Download mit Dateien um die 50 mb?

Vielen Dank euch beiden,
Grüße Magman.
 
Probier mal Folgendes:
PHP:
// absoluter Pfad zum Download-Verzeichnis
$baseDir = '/foo/bar/';


if( !isset($_GET['file']) || !strlen(trim($_GET['file'])) || $_GET['file'] !== ($_GET['file'] = basename($_GET['file'])) ) {
	// fehlender oder ungültiger Parameterwert
	header($_SERVER['SERVER_PROTOCOL'].' 400 Bad Request');
	exit;
}

if( !file_exists($baseDir.$_GET['file']) || !is_readable($baseDir.$_GET['file']) ) {
	// angeforderte Datei nicht vorhanden oder nicht lesbar
	header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
	exit;
}

set_time_limit(0);
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($baseDir.$_GET['file']));
header('Content-Disposition: attachment; filename="'.$_GET['file'].'"');
readfile($baseDir.$_GET['file']);
exit;
 
Hi Gumbo,

Danke für deinen Post, ich habs grad ausprobiert, es funktioniert leider auch nicht.
Wie gesagt kann ich keine
Code:
set_time_limit(0);
funktion verwenden.

Die einzige Möglichkeit die bisher funktioniert ist es das File als Zip-Datei direkt aus Flash zum Download anzubieten.

Code:
on (release) {
getURL("test.zip");
}

Ist zwar echt doof, weil es offensichtlich ist, daß ein komprimierter Film nur zum vereinfachten Download gezipt wurde und jeder Betrachter den Film nun noch einmal entpacken muss, aber gut - wenns schee macht.

Wenn euch noch was einfällt bitte Bescheid geben.

Grüsse, Magman.
 
Du könntest versuchen dies mit einer „.htaccess“-Einstellung zu umgehen:
Code:
<Files foo/bar.php>
    php_value max_execution_time 1
</Files>
Dies sollte funktionieren, wenn es in der .htaccess im Wurzelverzeichnis notiert und auf das „bar.php“-Skript im „foo“-Verzeichnis angewandt werden soll.
 
Zurück