繁体   English   中英

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

[英]Php file download corrupting audio files

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

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

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

普通文件

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

损坏的文件:

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

当我删除换行符和“ </ datalist>”标签时,音频文件再次工作。 这是我的文件下载脚本:

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

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

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

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

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

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

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

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

祝你今天愉快,

亚历克斯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM