PHP文件下载损坏音频文件



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

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

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

NORMAL File

RIFF† WAVEfmt D¬ ± data@ SÿSÿkÿkÿu o ÷1/2 [+eŸ0a/ô>T=êFE]JjHLJ¶P—NÊU...S‡[Y _b\'^×[èZ"XïS3Q

损坏的文件:

RIFF† WAVEfmt D¬ ± data@ SÿSÿkÿkÿu o÷1/2 [+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>';
}

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

application/octet-stream

在RFC 2046中被定义为"任意二进制数据"。也许尝试为音频文件使用正确的标题?您可以获取文件MIME信息以确定是否应该使用Content-Type: audio/mpeg,或者等效的.wav.mid

此外,如果从其他位置调用脚本,请确保没有输出回显。我猜没有,否则您将无法正确发送标题,但值得检查您的error_log.Datalist 是一个 HTML 标签,所以在我看来,该标签来自您的脚本中的早期,可能是输出缓冲或其他东西。无论如何,希望这有帮助。

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

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

在调用 readFile(( 之前,避免了文件的损坏!

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

有好的一天

亚历克斯

最新更新