2016-04-09 14 views
0

Sunucumdan php ile dosya indirmek istiyorum. Şimdiye kadar çok iyi çalışıyor, ama sadece içindeki metin dosyaları için (.txt.php, bu yüzden basit bir metin içeren dosyalar (ilginç bir fenomen olsa bile, metin başlamadan önce her zaman bir boş satır var ... fikirler neden?), bir .jpg dosya ya da hiç çalışmıyor bir .exe (açmaya çalışırken hata ...) indirmeye çalışırken ancak İşte PHP Sadece metin içeren dosyalarla çalışmayı karşıdan yükle.

Ben kullanılan kod:

<?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

Bu betik nasıl aranır? Sunucunuzun php ve txt dosyaları için mime-type ile başlığını ayarladığını düşünüyorum. – Naumov

+0

Başka bir php dosyasındaki bağlantı şu şekildedir: 'echo" ".$entry." \ n ".
'; – user5638730

cevap

2

dosyaları

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

çözüm PHP blokları hem katılmaktır kodunuzda boş satır için bir araya olduğundan adildir boş satır var nedeni Biri iki ayrı bloğa sahip olmak yerine.

Ayrıca, metin olmayan dosyaları da parçalar çünkü bunlar boş satırları veri olarak yorumlar ve dener ve işler.

+0

şaşırtıcı, bu gerçekten işe yarıyor ... Ama neden bana açıklayabilir misiniz? Neden kodu – user5638730

+0

@ user5638730 indirdiğim dosyanın içeriğiyle bir ilgisi var Temelde PHP sadece 'etiketlerinde bulunan işleri işleyecektir. Bu etiketlerin dışındaki herhangi bir şey yazılacak (eğer yankılanmış gibi) ve indirilmekte olan dosyanın bir parçası olacak. Bu, metinleriniz veya HTML'niz olduğu zamanki etiketler arasında boşluk bulunduğunuzda geçerlidir. – Chris

+0

Yani iki satır arasında "merhaba" yazarsam (yorumunuzun olduğu yer), metin dosyamda merhaba okuyabilirdim? – user5638730

0

Soru çözüldü,

Şimdi, komut dosyamı farklı dosya türlerine el ile yanıt vermek üzere değiştirdim jus t şöyle:

<?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.");