2016-04-09 3 views
0

Ich möchte Dateien von meinem Server mit PHP herunterladen können. Es funktioniert so weit so gut, aber nur für Dateien mit Text drin (.txt.php, also Dateien mit einfachem Text (auch wenn ich dort ein interessantes Phänomen habe, immer eine Leerzeile vor Textbeginn ... Ideen warum?), aber wenn ich versuche, eine .jpg Datei zum Download oder ein .exe es gar nicht funktioniert (Fehler beim Versuch ... zu öffnen)PHP Download funktioniert nur für Dateien mit Text

Hier ist der Code, den ich verwenden:

<?php 

session_start(); 

$file = basename($_GET['file']); 

$path = 'uploads/'.$_SESSION['userid']."/".$file; 
?> 

<?php 
if(!file_exists($path)){ 
    die("file not found"); 
} else { 
    header('Content-Description: File Transfer'); 
    header('Content-Disposition: attachment; filename="'.$file.'"'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($path); 
    exit; 
} 
+1

Wie nennt man das Skript? Ich denke, dass Ihr Server Header nach Mime-Typ für PHP-und TXT-Dateien gesetzt. – Naumov

+0

Es ist ein Link in einer anderen PHP-Datei, so: 'echo" ".$entry." \ n ". '
'; ' – user5638730

Antwort

2

Der Grund, warum die Dateien eine leere Zeile haben in nur ist, weil es eine leere Zeile im Code ist

... 
$path = 'uploads/'.$_SESSION['userid']."/".$file; 
?> 
         <--- There's the empty line. 
<?php 
if(!file_exists($path)){ 
    die("file not found"); 
... 

Die Lösung ist sowohl blockiert Ihre PHP miteinander zu verbinden, um eher als zwei getrennte Blöcke.

Dies bricht auch Nicht-Text-Dateien, weil sie Leerzeilen tatsächlich als Daten interpretieren und versuchen und verarbeiten.

+0

erstaunlich, das funktioniert wirklich ... Aber können Sie mir erklären, warum? Warum hat Code etwas mit dem Inhalt der Datei zu tun, die ich herunterlade – user5638730

+0

@ user5638730 Grundsätzlich verarbeitet PHP nur Dinge, die innerhalb '' Tags sind. Alles außerhalb dieser Tags wird ausgeschrieben (als ob Sie es "echo" hätten) und Teil der Datei werden, die heruntergeladen wird. Dies gilt genauso, wenn Sie Leerzeichen zwischen den Tags haben, wenn Sie Text oder HTML haben. – Chris

+0

Also wenn ich "Hallo" zwischen den zwei Zeilen schreiben würde (wo Ihr Kommentar ist), könnte ich Hallo in meiner Textdatei lesen? – user5638730

0

Frage gelöst,

Ich habe jetzt mein Skript geändert, um manuell auf verschiedene Arten von Dateien zu reagieren, jus t wie so:

<?php 

session_start(); 

$filename = basename($_GET['file']); 
$filename = 'uploads/'.$_SESSION['userid']."/".$filename; 

$file_extension = strtolower(substr(strrchr($filename,"."),1)); 

switch ($file_extension) { 
    case "pdf": $ctype="application/pdf"; break; 
    case "exe": $ctype="application/octet-stream"; break; 
    case "zip": $ctype="application/zip"; break; 
    case "doc": $ctype="application/msword"; break; 
    case "xls": $ctype="application/vnd.ms-excel"; break; 
    case "ppt": $ctype="application/vnd.ms-powerpoint"; break; 
    case "gif": $ctype="image/gif"; break; 
    case "png": $ctype="image/png"; break; 
    case "jpe": case "jpeg": 
    case "jpg": $ctype="image/jpg"; break; 
    default: $ctype="application/force-download"; 
} 

if (!file_exists($filename)) { 
    die("NO FILE HERE"); 
} 

header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header("Content-Type: $ctype"); 
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";"); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: "[email protected]($filename)); 
set_time_limit(0); 
@readfile("$filename") or die("File not found.");