2016-10-05 7 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ページに戻ります。その他のエスケープされていないファイルは、問題なくダウンロードされます。エスケープされたコードがあるときだけ、それは失敗します。
出力ファイルは、エスケープ文字列によって異なります。 ... fileのような結果は転送されますが、内容はありません。または、ファイルが使用できない文字列(mp3拡張子のないファイル名の一部)とともに返されます。コメントアウト行は私が試したものです

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; 
} 

:これは私の文字列エスケープファイルです

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; 
} 


これは、ファイル全体のダウンロードのヘッダファイルです。注...このスクリプトは動作します。非化成化されたデータではありません。 私はここで完全に失われています。新人プログラマーではなく、プロではない。

答えて

0

私の問題が見つかりました。私はそれにファイルサイズを追加しなかったので、ファイルの長さを読み取っていませんでした。これらの2行を追加し、完璧に動作します

$size = filesize('../data/lib/'.$file); 
header('Content-Length: ' . $size); 
関連する問題