我一直在用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>';
}
我尝试了许多建议的方法来下载文件,但是似乎都无法正常工作。
任何帮助将不胜感激,
亚历克斯。
答案 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()之前,避免了文件损坏!
谢谢您的所有建议,我也将它们添加到了脚本中。
祝你有美好的一天,
亚历克斯