2009-07-14 12 views
2

Ich mache eine Dateifreigabe-Website für den Spaß. Ich versuche es so zu machen, dass wenn ich den Download drücke, der Download startet. Anstatt nur ein Link zu /files/$file im Versuch, eine Header-Weiterleitung zu tun:php header herunterladen redirect

download.php

/** 
* File Download 
*/ 

$query = mysql_query("SELECT id,name,desc FROM files WHERE id = ".intval($_GET['id'])); 
$row = mysql_fetch_assoc($query); 

$file = $row['name']; 

if (file_exists($file)) { 
header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 
exit; 
} 

?> 

Filename: <?=$row['name']?> 
Desc: <?=$row['desc']?> 

<a href="#">Download this file</a> 

Im hier stecken, was soll ich als nächstes tun?

danke

+0

Was ist das Problem? –

+0

Beachten Sie, dass "readfile und fpassthru ungefähr 55% langsamer sind als eine Schleife mit feof/echo fread". nach jemandem auf php.net –

+0

@Alex L: Wow, wirklich? Ich dachte, ReadFile wäre schneller als es könnte mmap ... Haben Sie das jemals selbst getestet? – Josh

Antwort

0

Sie nur eine Umleitung, bevor eine html gedrückt wurde tun können.

Grundsätzlich nach

Filename: <?=$row['name']?> 
Desc: <?=$row['desc']?> 

<a href="#">Download this file</a> 

an den Browser gesendet wird, Ihre Chance, eine Umleitung mit PHP auszuführen ist vorbei. Vielleicht ist eine Javascript-Umleitung besser geeignet? Tutorial on Javascript redirects.

1

Ich folge nicht, was Sie fragen. Ein Header-Umleitung wie folgt aussieht:

header("Location: /path/to/new/page"); 

Wenn Sie die vorhandenen Informationen herunterladen möchten, sieht aus wie Sie es mit einer ID in der URL treffen müssen:

<a href="file.php?id=<?=$file_id ?>"> 

wo $file_id hat die ID der Datei, nach der Sie suchen. Persönlich würde ich das in eine andere Datei von der Seite einfügen, die den Eintrag und Download-Link zeigt, aber YMMV.

+0

Gemäß RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30 sollten Sie eine absolute URL verwenden. – Iiridayn

2

Meinst du etwas wie das, wo die Seite die Informationen über die Datei anzeigen wird und wenn der Benutzer dann auf den Link geklickt hat, wird es herunterladen?

<?php 

$query = mysql_query("SELECT id,name,desc FROM files WHERE id = ".intval($_GET['id'])); 
$row = mysql_fetch_assoc($query); 

$file = $row['name']; 

if(!file_exists($file)) 
{ 
    exit('File does not exist'); 
} 

if(intval($_GET['download'])===1) 
{ 
    // Generate the server headers 
    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) 
    { 
     header('Content-Type: "application/octet-stream"'); 
     header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header("Content-Transfer-Encoding: binary"); 
     header('Pragma: public'); 
     header("Content-Length: ".filesize($file)); 
    } 
    else 
    { 
     header('Content-Type: "application/octet-stream"'); 
     header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
     header("Content-Transfer-Encoding: binary"); 
     header('Expires: 0'); 
     header('Pragma: no-cache'); 
     header("Content-Length: ".filesize($file)); 
    } 
    $data = readfile($file); 
    exit($data); 
} 
else 
{ 
?> 
    Filename: <?php echo $row['name']; ?> 
    Desc: <?php echo $row['desc']; ?> 
    <a href="<?php echo $_SERVER['SCRIPT_NAME']; ?>?id=<?php echo $row['id']; ?>&download=1">Download this file</a> 
    <?php 
} 
?>