php header force下载返回无法使用的mp3

时间:2016-10-05 02:40:29

标签: php header

我已经为此工作了5天了......拆掉代码并重建代码。我正试图强制下载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;
}

注释掉的是我尝试过的。注意......这个脚本有效。只是没有未经过数据处理的数据。 我完全迷失在这里。不是新手程序员,也不是专业人士。

1 个答案:

答案 0 :(得分:0)

我发现了我的问题。我没有添加文件大小,所以它没有读取文件的长度。添加了这两行并完美无缺地工作

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