Download aus externem Ordner

Flex

(aka Felix Jacobi)
Also gut, ich hab jetzt alles mögliche versucht und auch die Suchfunktion zur genüge angestrengt (auch dein Script, Gumbo, habe ich gefunden) aber so richtig geholfen hat mir nichts...

Ich wollte ein Movie, aus einem Online RPG, hosten, Größe wird ca. 400MB sein.
Doch ich will nicht, dass man direkt auf die Datei zugreifen kann, also dachte ich mir, erstelle ich einen Ordner außerhalb des httpdocs... Doch leider kriege ich es nicht hin, eine Weiterleitung darauf zu machen...
readfile funktioniert leider nicht, aufgrund zu hoher Dateigröße.
ftp würde ich nur ungern verwenden aufgrund der mangelnden Zielbestimmung für den Download, ich würde schon gerne den User entscheiden lassen, wie er lädt.

Vielleicht habt ihr ja Ideen, mir fällt leider nichts mehr ein...

Hier mein bisheriges Script
PHP:
<?php
error_reporting(E_ALL);
ob_start();

function _get_browser()
{
  $browser = array ( //reversed array
   "OPERA",
   "MSIE",            // parent
   "NETSCAPE",
   "FIREFOX",
   "SAFARI",
   "KONQUEROR",
   "MOZILLA"        // parent
  );
 
  $info['browser'] = "OTHER";
  
  foreach ($browser as $parent) 
  {
   if ( ($s = strpos(strtoupper($_SERVER['HTTP_USER_AGENT']), $parent)) !== FALSE )
   {           
     $f = $s + strlen($parent);
     $version = substr($_SERVER['HTTP_USER_AGENT'], $f, 8);
     $version = preg_replace('/[^0-9,.]/','',$version);
     
     $info = $parent." ".$version;
     break; // first match wins
   }
  }
 
  return $info;
}  

$ip = $_SERVER['REMOTE_ADDR'];
$time = time();

$file = "./access.db";
$info = _get_browser();

$movie = "film.rar";
$path = "xxx";

$content = file($file);
$k = count($content);

for($i = 0; $i < $k; $i++) {
	$cont = explode(";", $content[$i]);
	if($cont[0] == $ip) {
		echo "<strong>Sie haben den Film bereits geladen!</strong>"; exit;
	} elseif($k = 600) {
		echo '<strong>Tut mir leid, aber es wurden bereits die maximal m&ouml;glichen Downloads geladen</strong>';
	}
}


$j = $k++;

$content[$j] = $ip.";".$info.";".$time."\n";

$fp = fopen($file, "a");

if(!fwrite($fp, $content[$j])) {
	echo '<strong>Fehler! Bitte den Admin kontaktieren!<br/><a href="mailto:root@censored">Flex</a></strong>';
} else {
	
	# Hier könnte eure Lösung stehen!
	
}
?>
 
Entferne mal den Aufruf der Ausgabepuffer-Steuerung (ob_start()) und probiere es nochmals mit der readfile()-Funktion. Denn diese Funktion ist für solche Einsätze eigentlich gedacht.
 
Also, wenn ich eine 500MB File nehme, stürzt anscheinend mein PHP ab und beendet sich nach der maximal erlaubten Laufzeit von PHP Scripts.
Bei einer 50MB großen Datei wird eine open_basedir Warnung ausgegeben, mal schauen was ich da machen kann. (VHost Datei suchen, etc.)

.Nachtrag

Ok, anscheinend kriege ich es doch nicht alleine hin...
<br />
<b>Warning</b>: readfile(): Unable to access /var/www/vhosts/flexmex.net/subdomains/tiarna/movie/ts2.tar.bz in <b>/var/www/vhosts/flexmex.net/subdomains/tiarna/httpdocs/download.php</b> on line <b>67</b><br />
<br />
<b>Warning</b>: readfile(/var/www/vhosts/flexmex.net/subdomains/tiarna/movie/ts2.tar.bz): failed to open stream: Permission denied in <b>/var/www/vhosts/flexmex.net/subdomains/tiarna/httpdocs/download.php</b> on line <b>67</b><br />
Das ist die aktuelle Fehlermeldung. Er sendet mir zwar eine Datei, die auch den im Script angegebenen Namen hat, aber die beinhaltet nur diese Fehlermeldung.

Dies habe ich in meiner vhost.conf erweitert:
<IfModule sapi_apache2.c>
php_admin_flag engine on
php_admin_value open_basedir "/var/www/vhosts/flexmex.net/subdomains/tiarna/httpdocs:/tmp:/var/www/vhosts/flexmex.net/subdomains/tiarna/movie"
</IfModule>
<IfModule mod_php5.c>
php_admin_flag engine on
php_admin_value open_basedir "/var/www/vhosts/flexmex.net/subdomains/tiarna/httpdocs:/tmp:/var/www/vhosts/flexmex.net/subdomains/tiarna/movie"
</IfModule>

Dateiberechtigung zum Testen auf 0777 gesetzt...

Achja, so sieht der PHP Code aus:
PHP:
header('Content-Type: application/octetstream', true);
    header('Content-Disposition: attachment; filename="'.$movie.'"');
    readfile("/var/www/vhosts/flexmex.net/subdomains/tiarna/movie/".$movie);
    exit;
 
Zuletzt bearbeitet:
Probier mal Folgendes:
PHP:
<?php

	header('Content-Type: application/octet-stream', true);
	header('Content-Disposition: attachment; filename="'.addslashes($movie).'"');
	if( !@readfile('/flexmex.net/subdomains/tiarna/movie/'.$movie) ) {
		header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found', true);
		header('Content-Type: text/plain', true);
		header('Content-Disposition: inline', true);
		echo 'Datei wurde nicht gefunden.';
	}
	exit;

?>
 
Nein, er sagt dass die Datei nicht geöffnet werden kann.
Rechte sind wie gesagt gesetzt und auch der Ordner hat den richtigen Besitzer.
 
Hast du denn vom Skript aus Zugriff auf das Verzeichnis beziehungsweise die Datei?
 
Danke für die Hilfe, hat sich alles erledigt...
Hatte gedacht, ich müsste den chmod des Verzeichnisses nicht ändern, da cgi-bin bzw. httpdocs auch nicht verändert sind. Nun da es 755 ist, funktioniert alles.
 
Zuletzt bearbeitet:
Ok, und nochmal ;)

Zugriff klappt alles wunderbar, jetzt das Problem mit den sehr großen Dateien...

<br />
<b>Fatal error</b>: Allowed memory size of 33554432 bytes exhausted (tried to allocate 207042560 bytes) in <b>/var/www/vhosts/flexmex.net/subdomains/tiarna/httpdocs/download.php</b> on line <b>69</b><br />

Genommen wurde jetzt das Plesk 7.5 Reloaded Image, ca. 202MB groß.
Anscheinend wird bei readfile versucht alles in den Ram zu laden, davon sind aber nur 32MB erlaubt durch die php.ini... Tja, und nun?
 
Zurück