2016-10-05 62 views
1

我一直在這工作了5天...現在撕毀代碼並重建它。我試圖強制一個mp3文件下載。當它沒有特殊字符(&符,引號,撇號)時,下載工作正常。我放棄了文件中的所有元數據,但是文件下載並且可以播放。
這是我的文件下載下載腳本:php頭部力量下載返回無法使用的mp3

header('Content-type: audio/mpeg'); 
header('Content-Disposition: attachment; filename="TraxXMP3_'.$file.'"'); 
readfile($file); 
    exit; 

我卑微的猜測是不被退還/消毒正確從數據庫中的數據。但不確定如何。我試過這個:

$var = str_replace("'","%27", $var); 
$var = str_replace("%27", "'" , $var); 
$var = htmlentities($var,ENT_QUOTES,'UTF-8'); 
$var = html_entity_decode($var,ENT_QUOTES,'UTF-8'); 

所有這些將允許從數據庫輸入和檢索。它將作爲修改後的字符串顯示在數據庫中,並返回到html頁面。所有其他未轉義的文件將無問題地下載。只有在轉義代碼時纔會失敗。
輸出文件因字符串轉義而異。像...文件的結果被轉移,但沒有內容。或者,文件返回不可用的字符串(部分文件名不帶mp3擴展名)。
這是整個文件下載頭文件:

if(isset($_GET['file'])){ 
$file = $_GET['file']; 
$sql = "SELECT * FROM main_lib WHERE file_name='.$file.' LIMIT 1"; 
$query = mysqli_query($db_conn, $sql) or die (mysqli_error()); 
while ($row = mysqli_fetch_array($query)) { 
$count_dl   = $row['count_dl']; 
} 
//mysqli_free_result($query); 
mysqli_query($db_conn, "UPDATE main_lib SET count_dl='$count_dl'+1 WHERE file_name='$file'"); 
/** 
* 
* EMAIL SCRIPT HERE 
* 
*/ 
mysqli_free_result($query); 
$file =  cleanVarsDn($file); 
    header('Content-type: audio/mpeg'); 
    header('Content-Disposition: attachment; filename="TraxXMP3_'.$file.'"'); 
    readfile('../data/lib/'.$file); 
    exit; 
} 

這是我的字符串轉義文件:

function cleanVarsUp($var){ 
    //$var = htmlentities($var,ENT_QUOTES,'UTF-8'); 
    //$var = str_ireplace("\"", """, $var); 
    $var = str_replace("'","%27", $var); 
    return $var; 
} 
function cleanVarsDn($var){ 
    //$var = str_ireplace("'", "'", $var); 
    //$var = html_entity_decode($var,ENT_QUOTES,'UTF-8'); 
    $var = str_replace("%27", "'" , $var); 
    return $var; 
} 

註釋掉線是什麼,我都試過了。請注意...此腳本確實可行。只是不涉及unsanitized數據。 我完全迷失在這裏。不是新手程序員,但不是專業人士。

回答

0

我發現我的問題。我沒有添加文件大小,所以它沒有讀取文件的長度。添加了這兩條線,並完美地工作

$size = filesize('../data/lib/'.$file); 
header('Content-Length: ' . $size);