php文件下载损坏了音频文件

时间:2018-08-31 09:43:55

标签: php audio download

我一直在用php编写文件下载器,以从我的网站下载一些音频文件(.mid,.wav,.mp3)。下载似乎工作正常,但是当我尝试播放下载的文件时,Windows Media Player说:

  

Windows Media Player无法播放文件。播放器可能不支持文件类型,或者可能不支持用于压缩文件的编解码器。

我使用文本编辑软件查看了文件,并注意到“损坏的”文件都有一个额外的换行符,并且在文件的开头都带有“ ”:

普通文件

  

RIFF†WAVEfmtD¬±data @SÿSÿkÿkÿuo÷½       [+eŸ0a/ô> T =êFE] JjHLJ¶P—NÊU…S‡[Y _b \’^×[èZ“XïS3Q

已损坏的文件:

  
    

  
     

RIFF†WAVEfmtD¬±data @SÿSÿkÿkÿuo÷½   [+eŸ0a/ô> T =êFE] JjHLJ¶P—NÊU…S‡[Y _b \’^×[èZ“XïS3Q

当我删除换行符并标记“ ”时,音频文件再次工作。 这是我的文件下载脚本:

$eyr = html_entity_decode($_GET['fileUrOpening']);

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header("Content-Transfer-Encoding: Binary"); 
header("Content-disposition: attachment; filename=".$eyr); 
header('Pragma: public');
readfile($eyr);

它从另一个脚本调用:

 $result = queryMysql("SELECT * FROM fichierschants WHERE chant = '$id';");
  $files = $result->num_rows;

  if ($files == 0) {
    echo '<td> There are no files for this song</td>';
  }else{

    echo '<td>';
    for ($i = 0 ; $i < $files ; ++$i){
        $result->data_seek($i); 
        $eode = $result->fetch_assoc()['emplacement'];
        echo'<a href="./readingFile.php?fileUrOpening=';
        echo $eode;
        echo '"">';
        $result->data_seek($i); 
        echo $result->fetch_assoc()['emplacement']."</a> <br>";
    }
    echo'</td>';
}

我尝试了许多建议的方法来下载文件,但是似乎都无法正常工作。
任何帮助将不胜感激,
亚历克斯。

2 个答案:

答案 0 :(得分:0)

application/octet-stream在RFC 2046中被定义为“任意二进制数据”。也许尝试为音频文件使用正确的标头?您可以获取文件mime信息来确定是否应使用Content-Type: audio/mpeg.wav.mid的等效文件。

此外,如果脚本是从其他地方调用的,请确保没有输出回显。我猜没有,或者您将无法正确发送标头,但是值得检查您的error_log。数据列表是一个HTML标记,因此在我看来,该标记来自您脚本的较早版本,可能是缓冲的输出或其他内容。无论如何,希望这会有所帮助。

答案 1 :(得分:0)

我终于发现清理输出缓冲区:

while (ob_get_level()) { ob_end_clean(); }

在调用readfile()之前,避免了文件损坏!

谢谢您的所有建议,我也将它们添加到了脚本中。

祝你有美好的一天,

亚历克斯