You are not logged in.

1

Monday, September 6th 2010, 11:40am

Indirekter Dateidwonload

Hallo zusammen,

ich stehe vor dem Problem, eine Datei indirekt herunterzuladen. "indirekt" heißt, dass der Benutzer in keinem Fall die URL der Datei sieht.
Aktuell kann ich die Datei zwar herunterladen mit (lt. Browser) der richtigen Dategröße von ca. 40MB aber auf der Platte hat die Datei dann 0 Bytes und ich kann sie logischerweise nicht öffnen.

Also ich habe einen Link zu einer Datei. Anschließend berechne ich für die HEADER die Dateigröße (die Berechnungt stimmt...). Dann sende ich die HEADER (vorher keine Ausgabe..) und anschließend buffere ich meine Datei.
Damit das ganze nicht gecached wird habe ich als verfallsdatum noch ein Datum in der Vergangenheit genommen.
Und hier das ganze in Code:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$fh = fopen($file,"rb");
if ( $fh === false )
    die("Download file missing or cant open File");
 
$filesize = strlen(file_get_contents($file));
 
header("Content-Type: application/octetstream");
header("Content-Length: ".$filesize);
header("Content-Disposition: attachment; filename=\"".$fileName."\"");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
 
rewind($fh); 
ob_start(); 
fpassthru($fh);
ob_end_flush();


Hat irgendjemand eine Ahnung wieso das nicht geht?
Statt den Download mit fpassthru zu realisieren habe ich auch readfile oder fread benutzt. Habe auch anstatt der Angabe des FileHandles direkt den Link zur Datei benutzt... Beides geht nicht..

2

Monday, September 6th 2010, 12:10pm

Ok, eh klar...
Man sucht 3 Tage an der Lösung, findet nichts... Kaum schreibt man verzweifelter Weise einen Forenbeitrag findet man 20 Minuten später die Lösung ;-)

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$filesize = strlen(file_get_contents($file));
 
header("Content-Type: application/octetstream");
header("Content-Length: ".$filesize);
header("Content-Disposition: attachment; filename=\"".$fileName."\"");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
 
$chunksize = 1 * (1024 * 1024);
if ($filesize > $chunksize)
{
  $handle = fopen($file, 'rb');
  $buffer = '';
  while (!feof($handle)) 
  {
    $buffer = fread($handle, $chunksize);
    echo $buffer;
    ob_flush();
    flush();
  }
  fclose($handle);
}
else
{
  readfile($file);
}

Similar threads

Social bookmarks